【问题标题】:Organizing shared partials组织共享部分
【发布时间】: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


    【解决方案1】:

    这可能会对您有所帮助:

    = 渲染部分:“共享/评论”,集合:@cmets,as::comment

    【讨论】:

      【解决方案2】:

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

      但是,将 'comments/form' 资源表单(POST/PUT 操作相关项)保留在该资源的视图命名空间范围内比将其转储到 views/shared 更有意义,因为当所有部分都包含来自不同资源的相似名称混淆了。我建议使用命名空间 views/shared/comments 来保持 sn-ps 用于循环模板,如 shared/comments/comments_on_homepageshared/comments/comments_for_admin 等。

      【讨论】:

        猜你喜欢
        • 2017-11-10
        • 2021-08-03
        • 1970-01-01
        • 1970-01-01
        • 2010-12-14
        • 2021-06-22
        • 1970-01-01
        • 2022-01-17
        • 2015-10-15
        相关资源
        最近更新 更多