组织共享部分
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
库中引用它的 location 和 name 来渲染局部的与其文件名相同,但没有前面的 _
或结尾 .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
的末尾。
- 我是否也应该把它放在
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
中?)
这可能会对您有所帮助:
= 渲染部分:"shared/comment",集合:@comments,作为::comment
首先,没有明确的指南。这完全取决于您的文件管理偏好。
但是,将 'comments/form'
您的资源表单(POST/PUT 与操作相关的项目)保留在该资源的视图命名空间范围内比将其转储到 views/shared
中更有意义,因为它可以当来自不同资源的所有具有相似名称的部分混淆时,会变得非常混乱。我建议使用命名空间 views/shared/comments
来保留循环模板的片段,例如 shared/comments/comments_on_homepage
、shared/comments/comments_for_admin
等
我们将共享的部分保留在 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
库中引用它的 location 和 name 来渲染局部的与其文件名相同,但没有前面的 _
或结尾 .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 arender
call is a simple name, Rails assumes that the target template is in the current controller’sview
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 underapp/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
calledshared
.
现在我很好奇我应该如何添加一个表单来创建一个新评论以放置在 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
中?)
这可能会对您有所帮助:
= 渲染部分:"shared/comment",集合:@comments,作为::comment
首先,没有明确的指南。这完全取决于您的文件管理偏好。
但是,将 'comments/form'
您的资源表单(POST/PUT 与操作相关的项目)保留在该资源的视图命名空间范围内比将其转储到 views/shared
中更有意义,因为它可以当来自不同资源的所有具有相似名称的部分混淆时,会变得非常混乱。我建议使用命名空间 views/shared/comments
来保留循环模板的片段,例如 shared/comments/comments_on_homepage
、shared/comments/comments_for_admin
等