组织共享部分

Organizing shared partials

我们将共享的部分保留在 app/views/shared 库中。

例如,如果我想显示特定 post 的评论,我可以执行以下操作:

app/views/shared/_comment.html.erb:

<tr>
  <td><%= comment.body %></td>
  <td><%= link_to 'Edit', edit_comment_path(comment) %></td>
  <td><%= link_to 'Destroy', comment, method: :delete, data: { confirm: 'Are you sure?' } %></td>
</tr>

app/views/posts/show.html.erb:

.
.
.
  <%= link_to 'Show Comments', '#', id: 'show-comments-link' %>
  <section id="comments-section">
  
    <table id="comments-table">
      <tbody>
        <%= render partial: 'shared/comment', collection: @comments %>
      </tbody>
    </table>

  </section>
  
</section>

看看我是如何通过在 app/views/shared 库中引用它的 locationname 来渲染局部的与其文件名相同,但没有前面的 _ 或结尾 .html.erb?

就是这行:

<%= render partial: 'shared/comment', collection: @comments %>

使用分音是 Rails 选择 convention over configuration 的一个很好的例子。这里有很多约定。

关注文件名、位置和代码组织(跳过 rendering collections). I think this quote from Agile Web Development with Rails 5 非常有帮助:

If the first option or :partial parameter to a render call is a simple name, Rails assumes that the target template is in the current controller’s view directory. However, if the name contains one or more / characters, Rails assumes that the part up to the last slash is a directory name and the rest is the template name. The directory is assumed to be under app/views. This makes it easy to share partials and subtemplates across controllers.

The convention among Rails applications is to store these shared partials in a subdirectory of app/views called shared.

现在我很好奇我应该如何添加一个表单来创建一个新评论以放置在 comments-section 的末尾。

这可能会对您有所帮助:

= 渲染部分:"shared/comment",集合:@comments,作为::comment

首先,没有明确的指南。这完全取决于您的文件管理偏好。

但是,将 'comments/form' 您的资源表单(POST/PUT 与操作相关的项目)保留在该资源的视图命名空间范围内比将其转储到 views/shared 中更有意义,因为它可以当来自不同资源的所有具有相似名称的部分混淆时,会变得非常混乱。我建议使用命名空间 views/shared/comments 来保留循环模板的片段,例如 shared/comments/comments_on_homepageshared/comments/comments_for_admin