Rails local_assign 对比局部变量

Rails local_assign vs. local variables

Rails guide 学习,我不明白 local_assign 下面是如何工作的:

To pass a local variable to a partial in only specific cases use the local_assigns.

  • index.html.erb

    <%= render user.articles %>
    
  • show.html.erb

    <%= render article, full: true %>
    
  • _articles.html.erb

    <h2><%= article.title %></h2>
    
    <% if local_assigns[:full] %>
      <%= simple_format article.body %>
    <% else %>
      <%= truncate article.body %>
    <% end %>
    

This way it is possible to use the partial without the need to declare all local variables.

当部分名称为 _articles 时,show 操作如何渲染它,它只会显示 index 操作?我也不明白你为什么要使用 full: true 添加选项,而你本可以使用 locals: {full:true}。有什么区别?

关于local_assigns的使用:

本指南这一部分的重点是展示如何在您的部分中访问 可选 局部变量。如果局部变量名称 full 可能 或可能不会 在您的局部变量中定义,则在未定义局部变量时简单地访问 full 将导致错误。

你有两个选择 可选 locals:

首先,使用 local_assigns[:variable_name],如果未提供指定的局部变量,它将是 nil,或者变量的值。

其次,您可以使用 defined?(variable_name),当未定义变量时将为 nil,或者当本地 为真时(字符串 "local_variable" 已定义。

使用 defined? 只是防止访问未定义的变量,您仍然必须实际 访问 变量以获取其值:

  • if local_assigns[:full]
  • if defined?(full) && full

关于您的具体问题:

How is the partial even being rendered by the show action when it has the name _articles, which will only show for the index action?

This is a typo。正确的部分名称是 _article.html.erb。不管动作是index还是show,正确的部分名称是模型的单数。在渲染模型集合的情况下(如 index.html.erb),部分仍应单独命名。

I also don't see why you use add the option of full: true when you could have just used locals: {full:true}. What's the difference?

重点是 full: true 语法更短。您有两个相同的选项:

  • render partial: @article, locals: { full: true }
  • render @article, full: true.

第二个明显更短且冗余更少。