我的问题是关于官方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
函数的调用有何意义?
答案 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?
有关build
,form_for
和form_with
https://m.patrikonrails.com/rails-5-1s-form-with-vs-old-form-helpers-3a5f72a8c78a的比较的更多信息