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

时间:2018-04-10 04:55:41

标签: ruby-on-rails

我对rails上的ruby很新,当我尝试更新记录时,abit在使用以下内容时感到困惑:

  1. <%= form_for @article, url:{action: "update"} do |form| %> 这个可行,但我不明白提交按钮如何显示'更新文章'

  2. <%= form_for :article, url:{action: "update"} do |form| %> 这个抛出没有路线匹配[POST]“/ articles / 2”,提交按钮说“保存文章”

  3. 最后:

    1. <%= form_with(model: @article) do |form| %> 实际更新记录,但我不明白为什么它调用更新,而不是其他方法

2 个答案:

答案 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_withform_forform_tag

的Rails 5.1替代品

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

我们的想法是提供一种具有更一致签名的方法。

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

答案 1 :(得分:0)

这完全取决于@artical。如果@artical是新对象(id中的@articalnil),则调用创建操作。如果@artical是现有对象,则它调用更新方法。