2012-09-10 48 views
3

我設置閃光燈輔助:Rails的提示信息輔助

def flash_message 
    flash.each do |key, msg| 
    content_tag :div, msg, :id => key, :class => 'flash' 
    end 
end 

而且我把這個在我的application.html.erb:

<%= flash_message %> 

而且它的返回了這樣的內容:

{:notice=>"Testing"} 

我對軌道相當新,所以這可能是一個業餘的錯誤。

回答

9

你說得對,這是一個業餘的錯誤。 ;)

使用.each這裏只是迭代消息併爲每個消息創建一個div。你想要的是從數組中創建一個數組,然後在最後連接它們。類似這樣的:

def flash_message 
    flash.map do |key, msg| 
    content_tag :div, msg, :id => key, :class => 'flash' 
    end.join 
end 
1

問題是你的幫手的回報。你必須在一個變量中返回html代碼。

與這個小變化工作對我來說:

def flash_message 
    html = "" 
    flash.each do |key, msg| 
     html << (content_tag :div, msg, :id => key, :class => 'flash') 
    end 
    html 
    end 

請記住,在紅寶石的最後一行是一個回報。

4

您沒有犯任何錯誤,並且通過創建幫助程序,您可以減少執行常見任務所需的代碼量,這對測試和組織非常有用。

我的一個建議是更改設置並使共享部分顯示代碼,以便管理更容易。然後讓你的幫助器方法只是將參數代理給部分函數調用。

首先設置您的部分(將其保存爲共享/ _flash_messages.html.erb):

<div class="flash-messages"> 
<% if messages && messages.length > 0 %> 
<% messages.each do |key, message| %> 
    <div id="<%= key %>" class="flash"><%= message %></div> 
<% end %> 
<% else %> 
    No Messages to display 
<% end %> 
</div> 

然後設置您的輔助方法:

def register_flash_message(key,message) 
    flash[key]=message 
end 

def display_flash_messages() 
    render 'shared/flash_messages', :messages => flash 
end 

這會使事情變得更容易維護和定製。因爲所有內容都存儲在部分內部,所以您也不必處理必須在Ruby內部構建HTML。

0

要獲得閃光燈消息跨度關閉按鈕,你可以做這樣的事情:(大概可以寫爽):

def flash_helper 
    content_tag :div, class: "flash-messages" do 
     flash.map do |key, value| 
     content_tag :div, class: "alert alert-dismissable alert-#{key}" do 
      content_tag(:span, '&times;'.html_safe, class: :close, 'data-dismiss' => 'alert') + value 
     end 
     end.join().html_safe 
    end 
    end