Rails 5-为它们之间具有has_many关系的“文章”创建“注释”

时间:2019-01-31 07:23:05

标签: ruby-on-rails ruby-on-rails-5

我的问题是关于官方Rails guide的6.4节

我有一个文章和一个评论模型,它们之间具有has_many关系。现在,我们编辑Article show模板(app / views / articles / show.html.erb),以使我们对每个Article进行新的评论:

<p>
  <strong>Title:</strong>
  <%= @article.title %>
</p>

<p>
  <strong>Text:</strong>
  <%= @article.text %>
</p>

<h2>Add a comment:</h2>
<%= form_with(model: [ @article, @article.comments.build ], local: true) do |form| %>
  <p>
    <%= form.label :commenter %><br>
    <%= form.text_field :commenter %>
  </p>
  <p>
    <%= form.label :body %><br>
    <%= form.text_area :body %>
  </p>
  <p>
    <%= form.submit %>
  </p>
<% end %>

<%= link_to 'Edit', edit_article_path(@article) %> |
<%= link_to 'Back', articles_path %>

有人可以ELI5 form_with声明吗?

  

form_with(模型:[@ article,@ article.comments.build],本地:true)

我了解必须为特定文章创建每个注释,并且指南中的描述还提到了form_with调用在这里使用数组,但是为什么我们需要将数组传递给模型:为什么我们在数组中有两个成员?如果我们仅将@article.comments传递给模型怎么办?与.build中使用的@article.comments.create调用相比,comments_controller.rb函数的调用有何意义?

1 个答案:

答案 0 :(得分:1)

Rails从https://生成路由。让我们考虑这种情况:

form_with

当文章是新的,并且在数据库中不存在时,Rails推断该路线为:

<%= form_with(@article) do |f| %>
 ...
<% end %>

因为您要创建一个新的

如果数据库中存在文章,Rails会生成更新路径:

articles_path(@article), action: :create

因此,数组表示该路径将被嵌套。因此,这段代码:

articles_path(@article), action: :update

如果注释在数据库中不存在,则生成此路由:

<%= form_with([@article, @article.comments.build]) do |f| %>
 ...
<% end %>

否则,路线将为:

article_comments_path(@article, @article.comments.build), action: :create

有关article_comments_path(@article, @comment), action: :update new之间的区别的更多信息:What is the difference between build and new on Rails?

有关buildform_forform_with https://m.patrikonrails.com/rails-5-1s-form-with-vs-old-form-helpers-3a5f72a8c78a的比较的更多信息