1

按照ROR 的指南入门教程,我正在制作一个博客,其中包含两个模型 - 发布和评论 - 在 config/routes.rb 文件中具有以下关联:

resources :posts do
  resources :comments
end

因此,view/posts/show.html.erb出于显示原因,评论和评论表单会显示在博客页面上。但是,我一直在理解@post, @post.comments.build以下代码片段中的含义:

<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br />
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br />
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

此外,在重构期间,作者已将代码移动以显示对view/comments/_comment.html.erb部分的注释,并将其渲染为view/posts/show.html.erb使用

<%= render @post.comments %>

现在,这将为集合app/views/comments/_comment.html.erb中的每个评论呈现部分内容。@post.comments当 render 方法遍历@post.comments集合时,它将每个注释分配给与局部变量命名相同的局部变量,在这种情况下,注释随后在局部变量中可供我们显示。

问:rails 如何从上面的代码行推断部分名称和要传递给部分以显示注释的变量?

另外,您能否根据上述博客应用程序解释以下语句的含义。参考: http: //guides.rubyonrails.org/getting_started.html

The @post object is available to any partials rendered in the view because we defined it as an instance variable.
4

1 回答 1

3

第一个问题。

是什么[@post, @post.comments.build]意思?

基本上,这是在您的表单中实例化将要生成的内容。,@post它也将构建@post.comments。但这似乎没有必要,我认为您可以通过以下方式完成相同的操作:

<%= form_for @post do |f| %>

除非它自己生成表单,否则您也有机会在同一时间写评论。

第二个问题。

部分工作的方式是,只要它们与对象同名。在您的情况下_comment.html.erb,名称与您的模型相同Comment。所以 Rails 会自动假设这就是你要找的东西。

如果您要将局部名称更改为其他名称,则应更具体地编写:

<%= render :partial => 'comments/sweet_comment_partial_name', :collection => @post.comments %>

更新

啊,好吧,我没有意识到你指的是什么形式。这一个专门实例化这个:

[@post, @post.comments.build]

指的是评论模型。但它说评论的父母是@post。因此,您具体引用的评论模型是 的子级@post,并且将构建在或附加到与该 关联的评论数组中@post

于 2012-06-30T21:19:44.827 回答