在我的应用程序中,我经常需要显示几个闪光灯,有时是同一类型的。在这种情况下,我会做一些
我的控制器有些动作
flash[:alert] = []
...
flash[:alert] << error1 if something_bad_happened
...
flash[:alert] << error2 if something_else_bad_happened
在我看来,我迭代每种类型的闪光灯,检查我的闪光灯是普通闪光灯还是一组闪光灯。
flash.each do |type, val|
if flash[:type].is_a?(Array)
flash[:type].each do |fl|
render_flash(fl)
end
else
render_flash(flash[:type])
end
end
这很酷,工作也很好,但是在我的代码中,我最终使用了标准flash和“array”flash的混合操作,我发现这很愚蠢。
有没有办法可以覆盖闪光灯设置器
flash[:alert] = error_x
…实际上总是将错误信息推送到一个闪存阵列上?
编辑:
上面用于处理“闪烁数组”的代码是我找到的实现目标的快速方法,现在如果你告诉我这太不干净了,而且你有更好的解决方案,我肯定会接受它(或者至少在我将来有类似的事情要做时,我会记住它)。我主要用这段代码来解释一下上下文
编辑2:
最后,我使用了标准闪存和“阵列”闪存的混合操作
我是说,例如,在一些控制器中
flash.error = error_message
#or
render 'something', alert: error_message
# or
flash[:error] = error_message
现在,我正在精炼很多代码,在助手中的其他地方,我可能想显示一个额外的错误消息,假设flash已经是一个数组
class MyController < ApplicationController
def my action
if my_command_failed
flash[:alert] = "Your command failed" # let's suppose it's the original []= method of flash here
MyHelper::SomeTools.fix_stuff
end
redirect_to after_error_path
end
end
class MyHelper::SomeTools
def fix_stuff
...
flash[:alert] << "Oh btw, there was also an error here..."
# ... Which would normally crash, but I'd like to have some "clever code", which would fix the mistake for me (so making an array with both error messages)
end
end
最佳答案
鉴于eugene petrov在他的评论中指出flash消息可以是任何原始的,那么如果您觉得在某些情况下需要数组,那么您可以考虑始终将该值设置为数组。
您可以在applicationcontroller中创建一个简单的flash包装器,强制将输入转换并分配给数组。
def multiflash(type, message)
flash[type] ||= []
flash[type] << message
end
在你的控制器中使用。
在视图中,简单地假设flash总是一个数组。
<% flash.each do |type, val| %>
<% flash[:type].each do |fl| %>
render_flash(fl)
<% end %>
<% end %>
正如您已经注意到的,有时存储
Array
s而其他时间存储String
s的密钥不是一个好主意。