Rails两种消息渲染方式有什么区别?

What's the difference between the two ways of message rendering in Rails?

我复制了一个现有的 rails 存储库,但我发现了两种在不同网页中呈现消息以查看文件的方法。

这是第一个,可以将controller中的“notice”或“alert”渲染到网页上

<% flash.each do |type, msg| %>
  <div>
    <%= msg %>
  </div>
<% end %>

这是第二个,没机会触发

<% if @task.errors.present? %>
        <ol>
        <% @task.errors.each do |error, message| %>
          <li>WARNING: <%= "#{error.capitalize}  #{message}" %>
           </li>
           <% end %>
       </ol>
<% end %>

请问它们的本质区别是什么?它们可以相互替代吗?

I wonder what is the essential difference between them?

这是两个完全不同的概念。

首先是遍历 the flash。这基本上只是一个简单的基于 cookie 的存储,用于将字符串、哈希或数组等原始数据传递给 下一个请求 。 flash 通常在重定向后向用户显示消息时使用。

例如:

def deny_access
  flash[:alert] = "You must be signed in."
  redirect_to new_session_path
end

您还可以使用 flash.now 当前 请求设置即显消息。每次请求后,闪存中的旧消息都会被清除。 Flash 通常用作一种系统范围的公告系统,并在页面顶部显示为横幅。

第二个是(糟糕地)遍历附加到模型特定实例的 ActiveModel::Errors 实例。这是验证错误的集合,当 .valid? 在模型实例上被调用(通常是间接调用)时会被填充。

当前请求周期中显示模型的验证错误时使用它。通常在表单的顶部或相应输入的内联。

由于此数据仅存储在内存中的实例变量中,因此它不会跨重定向持续存在。

Can they replace each other?

不 - 不是真的。两者都用于提供用户反馈,但它们是解决不同工作的非常不同的工具。虽然并没有真正阻止一些新手尝试。

参见: