我对rails上的ruby很新,当我尝试更新记录时,abit在使用以下内容时感到困惑:
<%= form_for @article, url:{action: "update"} do |form| %>
这个可行,但我不明白提交按钮如何显示'更新文章'
<%= form_for :article, url:{action: "update"} do |form| %>
这个抛出没有路线匹配[POST]“/ articles / 2”,提交按钮说“保存文章”
最后:
<%= form_with(model: @article) do |form| %>
实际更新记录,但我不明白为什么它调用更新,而不是其他方法答案 0 :(得分:2)
form_for(@article)
创建一个绑定到模型实例的表单构建器。如果@article
为零,则会引发错误。
如果该实例是新记录,则该表单将使用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 action="/articles" method="POST">
<input type="text" name="article[title]" value="Hello World"/>
...
</form>
<%= form_for @article, url:{action: "update"} do |form| %>
这个 工作,但我不明白提交按钮如何说'更新 文章“
表单构建器知道它正在通过调用传递给.new_record?
的记录上的form_with
来更新记录。您可以通过提供翻译来更改提交按钮的默认值:
# config/locales/en.yml
en:
helpers:
submit:
create: "Save new record"
update: "Save changes"
form_for(:article)
创建一个不包装对象的作用域表单构建器。这将创建一个表单构建器,其中输入将是“作用域”。例如:
<%= form_for(:article) do |f| %>
<%= f.text_input :title %>
<% end %>
这将呈现如下内容:
<form action="/articles" method="POST">
<input type="text" name="article[title]"/>
...
</form>
Rails根据约定优于配置派生action属性的URL。
在您的情况下,<%= form_for :article, url:{action: "update"} do |form| %>
会导致路由错误,因为form_for
默认为method: "POST"
。
form_with
是form_for
和form_tag
form_with
将替换密切相关但具有非常不同签名的form_for
和form_tag
方法。 form_for
和form_tag
已被软折旧,并计划删除。
我们的想法是提供一种具有更一致签名的方法。
如果您使用的是Rails 5.1+,那么您应该使用它。
答案 1 :(得分:0)
这完全取决于@artical
。如果@artical
是新对象(id
中的@artical
是nil
),则调用创建操作。如果@artical
是现有对象,则它调用更新方法。