在rails_for @article和form_for:article中的rails差异
我刚接触ruby on rails,当我尝试更新记录时,abit在使用以下内容时感到困惑:
-
这个有效,但我不明白为什么提交按钮说’更新文章’
-
这一个抛出没有路由匹配[POST]“/ articles / 2”,并且提交按钮显示“保存文章”
最后:
-
实际更新记录,但我不明白为什么它调用更新,而不是其他方法
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_with
是form_for
和form_tag
的Rails 5.1替代品
form_with
将替换密切相关但具有非常不同签名的form_for
和form_tag
方法。 form_for
和form_tag
已经软折旧,并计划删除。
这个想法是提供一个具有更一致的签名的方法。
如果您使用的是Rails 5.1+,那么您应该使用它。
看到:
- Rails指南 – 操作视图表单助手
- Rails API – ActionView :: Helpers :: FormHelper
- Rails 5.1的form_with与form_tag对form_for
这完全取决于@artical
。 如果@artical
是新对象( @artical
id
为nil
)则调用create动作。 如果@artical
是现有对象,则它调用update方法。