我已经设置了一个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非常陌生,所以这可能是一个业余错误。
答案 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, '×'.html_safe, class: :close, 'data-dismiss' => 'alert') + value
end
end.join().html_safe
end
end