Rails 3 / Controller / Flash哈希

时间:2011-02-01 16:38:11

标签: ruby-on-rails ruby-on-rails-3 actioncontroller

我希望能够将多个消息传递到我的控制器内部的闪存哈希,并让它们很好地显示在一起,例如,在项目符号列表中。我设计的方法是在我的Application Controller中创建一个辅助函数,它将一个数组格式化为一个项目符号列表,然后我将其传递给flash [:success]。这显然不是Rails方式,因为,即使我的项目符号列表被编码。也就是说,而不是得到:

  • 消息1
  • 消息2

我明白了:

< ul>< li>消息1< / li>< li>消息2< / li>< / ul>

我确信我可以找到一种方法来生成()输出,但是有没有一种简单的方法来获得这样的工作?也许有传递给flash []的选项?还有别的吗?

3 个答案:

答案 0 :(得分:3)

我使用render_to_string和部分而不是助手来实现类似的东西。

# app/controller/dogs_controller.rb
def create
  @dog = Dog.new(params[:dog])
  @messages=[]
  if @dog.save
    @messages << "one"
    @messages << "two"
    flash[:notice] = render_to_string( :partial => "bulleted_flash")
    redirect_to(dogs_path)
  else
    render :action => 'new
  end
end

然后我在HTML列表中格式化flash消息数组

# app/views/dogs/_bulleted_flash.html.erb
<ol>
  <% @messages.each do |msg| %>
  <li><%= msg %></li>
  <% end %>
</ol>

生成以下HTML

# http://0.0.0.0:3000/dogs
<body>
  <div id="flash_notice">
    <ul>
      <li>one</li>
      <li>two</li>
    </ul>
  </div>
  ...
</body>

如果您需要继续使用帮助程序,那么我认为您需要将html_safe方法附加到字符串以防止对其进行编码(默认情况下,rails 3会执行此操作)。这是question showing how to use html_safe in a similar fashion

答案 1 :(得分:0)

如果您使用的是Rails3,请尝试使用raw方法。

raw(my_html_string)

它不会逃避HTML。哦,对不起,我刚看完你的最后一句话。看看这个信息,“Rails 3 flash message problems”,它看起来可能就是你想要的:

http://www.ruby-forum.com/topic/215108

答案 2 :(得分:0)

通常我会在这种情况下询问有关您的视图和布局的更多信息,因为脚手架默认情况下不会显示flash[:success]

我解决这个问题的方法是通常通过每次都使flash[:whatever]数组,并在我的布局中处理该数组而不仅仅是通知来完全重做我的flash消息。请记住,flash只是一个哈希,你只是设置值。

但是,如果您只想使用现在的设置(帮助将HTML放在flash[:success]内),则可以更改Flash消息在布局文件中的显示方式。默认情况下,它们只是使用<%= flash[:success] %>,它会自动转义HTML。要使其不对Flash消息执行此操作,请将其更改为<%=raw flash[:success] %>