5

我已经设置了一个 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

4 回答 4

10

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

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

def flash_message
  flash.map do |key, msg|
    content_tag :div, msg, :id => key, :class => 'flash'
  end.join
end
于 2012-09-10T04:08:20.457 回答
4

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

我的一个建议是您更改设置并制作共享部分以显示代码,以便更易于管理。然后让您的辅助方法将参数代理到部分函数调用。

首先设置您的部分(将其保存为 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,因为所有内容都存储在部分中。

于 2012-09-10T04:59:15.100 回答
1

问题是你的助手的回归。您必须在变量中返回 html 代码。

这个小小的改变对我有用:

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

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

于 2012-09-10T04:13:26.233 回答
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
于 2014-03-29T16:18:18.783 回答