【发布时间】:2017-07-03 14:23:24
【问题描述】:
我们将共享部分保存在 app/views/shared 库中。
例如,如果我想显示特定帖子的 cmets,我可以执行以下操作:
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 中引用它的 location 来呈现部分,并且 name 与它的文件名相同但没有前面的 @ 987654330@ 还是结尾.html.erb?
这里就是这条线:
<%= render partial: 'shared/comment', collection: @comments %>
使用 partials 是 Rails 选择 convention over configuration 的一个很好的例子。这里有很多约定。
关注文件名、位置和代码组织(跳过rendering collections)。我认为Agile Web Development with Rails 5 的这句话很有帮助:
如果
render调用的第一个选项或:partial参数是一个简单的名称,Rails 假定目标模板在当前控制器的view目录中。但是,如果名称包含一个或多个/字符,Rails 会假定最后一个斜杠之前的部分是目录名称,其余部分是模板名称。假定该目录位于app/views下。这使得跨控制器共享部分和子模板变得容易。Rails 应用程序之间的约定是将这些共享部分存储在
app/views的子目录中,称为shared。
现在我很好奇我应该如何添加一个表单来创建一个新的评论放在comments-section 的末尾。
- 我是不是也应该把它放在
app/views/shared目录中,命名为_comment_form.html.erb,然后继续引用它为'shared/comment_form'? - 我是否应该将所有内容移至
app/views/comments目录,将其命名为_form.html.erb,并将其引用为'comments/form'(并违反shared目录约定)? - 还有新评论,我应该在
Posts#show操作中创建@new_comment = Comment.new吗? - 您遵循哪些一般准则来帮助您决定如何组织共享部分? (也许应该放在
shared/comments/_form.html.erb?)
【问题讨论】:
标签: ruby-on-rails model-view-controller ruby-on-rails-5 partials