在rails_for @article和form_for:article中的rails差异

我刚接触ruby on rails,当我尝试更新记录时,abit在使用以下内容时感到困惑:

  1. 这个有效,但我不明白为什么提交按钮说’更新文章’

  2. 这一个抛出没有路由匹配[POST]“/ articles / 2”,并且提交按钮显示“保存文章”

最后:

  1. 实际更新记录,但我不明白为什么它调用更新,而不是其他方法

form_for(@article)创建一个绑定到模型实例的表单生成器。

如果@article为nil,则会引发错误。

如果实例是新记录,则表单将使用method="POST"action="/arcticles"

如果记录已被持久化,则它将具有method="PATCH"action="/arcticles/:article_id"

Rails根据约定优于配置派生action属性的URL。 因此,如果遵循约定,则无需显式传递url选项。

一个例子是:

 <% @article = Article.new(title: 'Hello World') %> <%= form_for(@article) do |f| %> <%= f.text_input :title %> <% end %> 

这将呈现如下内容:

 
...

<%= form_for @article, url:{action: "update"} do |form| %> <%= form_for @article, url:{action: "update"} do |form| %>这个有效,但我不明白为什么提交按钮说’更新文章’

表单构建器知道它正在通过调用.new_record?来更新记录.new_record? 在您传递给form_with的记录上。 您可以通过提供翻译来更改提交按钮的默认值:

 # config/locales/en.yml end: helpers: submit: create: "Save new record" update: "Save changes" 

form_for(:article)创建一个不包装对象的作用域表单构建器。

这将创建一个表单构建器,其中输入将“作用域”。 例如:

 <%= form_for(:article) do |f| %> <%= f.text_input :title %> <% end %> 

这将呈现如下内容:

 
...

Rails根据约定优于配置派生action属性的URL。

在你的情况下<%= form_for :article, url:{action: "update"} do |form| %> <%= form_for :article, url:{action: "update"} do |form| %>导致路由错误,因为form_for默认为method: "POST"

form_withform_forform_tag的Rails 5.1替代品

form_with将替换密切相关但具有非常不同签名的form_forform_tag方法。 form_forform_tag已经软折旧,并计划删除。

这个想法是提供一个具有更一致的签名的方法。

如果您使用的是Rails 5.1+,那么您应该使用它。

看到:

  • Rails指南 – 操作视图表单助手
  • Rails API – ActionView :: Helpers :: FormHelper
  • Rails 5.1的form_with与form_tag对form_for

这完全取决于@artical 。 如果@artical是新对象( @artical idnil )则调用create动作。 如果@artical是现有对象,则它调用update方法。