【问题标题】:Is there a way to make the flash[:notice] appear above, or before, the flash[:error]?有没有办法让 flash[:notice] 出现在 flash[:error] 的上方或之前?
【发布时间】:2010-04-07 06:40:14
【问题描述】:

所以,我希望能够在同一个操作中同时显示 flash[:notice] 和 flash[:error],但我希望 :notice 始终显示在上方(或之前) 错误。有没有办法做到这一点?

在我的控制器中,我认为我可以在 flash[:notice] 之前对 flash[:error] 进行编码,这样 rails 就可以正确显示它,而且大多数情况下它都会显示。但是它们时不时地随机切换,我似乎无法弄清楚为什么。那么,如何确保 flash[:notice] 始终显示在 :error 上方?

编辑:感谢 Ben 和 Ryan 的建议,我现在刚刚在我的布局/应用程序文件中设置了条件。

    <% if flash[:notice] %>
        <div id="flash_notice"><%= flash[:notice] %></div>
    <% end %>

    <% if flash[:error] %>
        <div id="flash_error"><%= flash[:error] %></div>
    <% end %>

我对此很满意,但也许有更好的方法?

编辑#2:是的,有。本将其添加到下面的答案中。再次感谢 Ben 先生。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    显示顺序仅取决于您的视图代码。如果您在控制器中执行此操作:

    flash[:notice] = "Notice me"
    flash[:error] = "BAAAAADDDD"
    

    在你看来:

    <p><%= flash[:notice] %></p>
    <p><%= flash[:error] %></p>
    

    :通知总是最先出现。

    试试这个更优雅的方法。您在数组中定义的顺序就是它们出现的顺序:

    <% [:error, :notice].each do |condition| %>
      <%= "<p class='#{condition.to_s}'>#{flash[condition]}</p>" if flash.has_key?(condition) %>
    <% end %>
    

    【讨论】:

    • 谢谢本。我刚刚依赖于我在应用程序布局中定义的代码(类似于下面 Ryan Bigg 指出的代码)。除了应用程序布局中的一般代码之外,我不知道我可以为这样的特定视图指定它们的顺序。再次感谢 Ben 先生。
    • 编辑:我的意思不是除了布局/应用程序文件中的通用代码。我刚刚使用了 Ryan Bates 的 nifty_layout 生成的内容。取而代之的是,我现在刚刚定义了您在上面的闪光灯,以及它们相应的 CCS id。此外,我必须包括闪光灯何时为空的条件。如果有更好的方法,我将代码添加到我的问题中。再次感谢您。
    • 肯定有更复杂的方法——我只是想让你明白这个想法。我会在我的答案中添加一些内容以帮助您入门。
    • 这太优雅和干净了。我更喜欢我的代码更笨重和繁琐。 j/p,非常感谢 Ben,我现在也更好地理解了 flash,非常感谢。
    • if flash.has_key?(condition) 在 Rails 3.1 中不起作用,因为 [在 Rails 3.1 中,FlashHash 不是从哈希派生的] (github.com/rails/rails/blob/3-1-stable/actionpack/lib/…) 改用 if flash.include?(condition)
    【解决方案2】:
    Always nil your notice and error object.
    
    <% if flash[:notice] %><p><%= flash[:notice] %><% flash[:notice]=nil %></p><% end %>
    <% if flash[:error] %><p><%= flash[:error] %><% flash[:error] =nil %></p><% end %>
    

    【讨论】:

    • 只是好奇,为什么你总是 nil 通知和错误对象?
    • 如果您没有将通知和错误设为零,那么如果您呈现到另一个页面,则会出现相同的通知/错误。我遇到了同样的问题,所以我养成了一个习惯,一旦我在视图中显示,通知/错误总是为零。欢呼的
    • 这种行为是设计使然。如果您不希望将 flash 传递给下一个操作,则可以改用Flash.now
    • 谢谢你,萨利尔。正如 JRL 指出的那样,您只需 flash.now[:error] ,它将在下一个操作时自动清除。这实际上就是我在这个例子中使用的。
    【解决方案3】:

    我会将此作为评论,但它不能很好地执行多行代码 sn-ps。它们可能是“随机切换”的,因为您是这样使用它的:

      <% flash.each do |k, v| %>
        <div id='flash_<%= k %>'><%= v %></div>
      <% end %>
    

    在 1.8 中,哈希键是无序的,因为 flashHash,所以您将按照 Ruby 当时感觉的任何顺序获得这些输出。正如 Ben 建议的那样,手动将它们按“正确”的顺序排列会有所帮助。

    【讨论】:

    • 有人会读心术。是的,这与我在布局/应用程序文件中使用的代码非常接近。也感谢瑞恩的进一步解释。 (旁注:我是你博客的粉丝。)
    • 呵呵,不是读心术,只是观察 Ruby on Rails 中的模式 :)。很高兴知道我还有另一个粉丝。
    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 1970-01-01
    • 2011-11-26
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多