Rails flash消息助手

时间:2012-09-10 03:37:31

标签: ruby-on-rails ruby-on-rails-3 flash-message

我已经设置了一个flash助手:

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"}

我对rails非常陌生,所以这可能是一个业余错误。

4 个答案:

答案 0 :(得分:10)

你是对的,这是一个业余的错误。 ;)

在这里使用.each只是迭代消息并为每个消息创建一个div。你想要的是从div中创建一个数组,然后在最后将它们连接在一起。像这样:

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

答案 1 :(得分:4)

您没有犯任何错误,并且通过创建帮助程序,您减少了执行常见操作所需的代码量,这对于测试和组织非常有用。

我的一个建议是,您更改设置并使共享部分显示代码,以便更容易管理。然后让你的helper方法代理部分函数调用的参数。

首先设置你的部分(保存为shared / _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,因为所有内容都存储在部分内部。

答案 2 :(得分:1)

问题在于帮助者的回归。您必须在变量中返回html代码。

这一点变化对我有用:

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

请记住,ruby中的最后一行是返回。

答案 3 :(得分:0)

要获得flash消息范围的结束按钮,您可以执行以下操作:(它可能写得更好):

  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