我们将共享的部分保留在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
?)答案 0 :(得分:1)
首先,没有明确的指南。它完全基于您的文件管理首选项。
但是,在您的资源范围内保留'comments/form'
您的资源表单(POST / PUT操作相关项)&#39; view namespace比在views/shared
中转储更有意义,因为当来自不同资源的所有具有相似名称的部分混淆时,它会变得非常混乱。我建议使用命名空间views/shared/comments
来保留用于循环模板的代码段,例如shared/comments/comments_on_homepage
,shared/comments/comments_for_admin
等。
答案 1 :(得分:-1)
这可能会对您有所帮助:
= render partial:“shared / comment”,collection:@comments,as :: comment