组织共享部分

时间:2017-02-15 04:17:46

标签: ruby-on-rails model-view-controller ruby-on-rails-5 partials

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

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

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 lib和名称中引用部分位置,了解我如何呈现部分内容作为它的文件名但没有前面的_或结尾.html.erb

这条线就在这里:

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

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

关注文件名,位置和代码组织(以及跳过rendering collections)。我认为来自Agile Web Development with Rails 5的引用非常有用:

  

如果:partial调用的第一个选项或render参数是一个简单名称,Rails会假定目标模板位于当前控制器的view目录中。但是,如果名称包含一个或多个/个字符,则Rails会假定直到最后一个斜杠的部分是目录名称,其余部分是模板名称。假定该目录位于app/views下。这样可以轻松地跨控制器共享部分和子模板。

     

Rails应用程序之间的惯例是将这些共享部分存储在名为app/views的{​​{1}}子目录中。

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

  • 我是否应该将其放在comments-section目录中,将其命名为app/views/shared,然后继续将其引用为_comment_form.html.erb
  • 我应该将所有内容移到'shared/comment_form'目录中,将其命名为app/views/comments,并将其引用为_form.html.erb(并违反'comments/form' dir惯例)?
  • 那么新评论呢,我应该在shared行动中制作@new_comment = Comment.new吗?
  • 您遵循哪些一般性指导原则来帮助您决定如何组织共享的部分内容? (也许应该进入Posts#show?)

2 个答案:

答案 0 :(得分:1)

首先,没有明确的指南。它完全基于您的文件管理首选项。

但是,在您的资源范围内保留'comments/form'您的资源表单(POST / PUT操作相关项)&#39; view namespace比在views/shared中转储更有意义,因为当来自不同资源的所有具有相似名称的部分混淆时,它会变得非常混乱。我建议使用命名空间views/shared/comments来保留用于循环模板的代码段,例如shared/comments/comments_on_homepageshared/comments/comments_for_admin等。

答案 1 :(得分:-1)

这可能会对您有所帮助:

= render partial:“shared / comment”,collection:@comments,as :: comment