【问题标题】:How does form_for knows what URL/path to go when the submit button is clicked?当单击提交按钮时,form_for 如何知道要走的 URL/路径?
【发布时间】:2017-05-09 13:56:26
【问题描述】:

我正在创建一个名为 User 的脚手架。我检查了部分视图“_form”的代码,我看到下面的代码sn-p:

<%= form_for(user) do |f|  %>
   <div class=field>
      <%= f.label :firstname %>
      <%= f.text_field :firstname %>
   </div>
   <div class="actions">
      <%= f.submit %>
   </div>
<% end %>

所以如果你点击上面代码生成的提交按钮,rails 怎么知道要去哪个 URL/路径,因为它没有指定要查找的路径?

【问题讨论】:

标签: ruby-on-rails


【解决方案1】:

除了Amr El Bakry's answer,让我帮你揭开form_for helper 方法背后的Rails 魔力。

所以你的问题基本上是:form_for 如何找到提交到的路径以及它如何区分创建/更新记录?

Rails 实际上通过 record identification 解决了这个问题。在这一点上值得举一个例子:

## Creating a new user
# long style
form_for(@user, url: users_path)
# short style - record identification gets used
form_for(@user)

## Updating an existing user
# long style
form_for(@user, url: user_path(@user), html: { method: "patch" })
# short style - record identification to the rescue
form_for(@user)

您可以清楚地看到 short style 在两种情况下相同。 记录识别足够智能,可以通过调用@user.persisted? 来判断记录是新记录还是现有记录

您可能有兴趣在line 462 上的form_helper.rb 内的form_for 定义中自己声明这一事实!

希望对你有帮助!

【讨论】:

    【解决方案2】:

    在您的 config/routes.rb 文件中,您会发现 Rails 在您生成脚手架时添加了resources :users。这称为资源丰富的路由,它会为您的user 资源创建七个不同的路由;每个路由都将一个 HTTP 动词和一个 URL 映射到一个控制器操作。

    在您的情况下,当您提交表单时,HTTP 动词是 POST,路径是映射到 users 控制器内的 create 操作的 /users。这是 Rails 的默认设置,您可以在 Rails Guides on Routing 中阅读所有相关信息。

    【讨论】:

    • 好的,所以它会在控制器的资源路由创建的路由中查找具有 POST HTTP 动词的模式?因此,例如,如果我有两个资源丰富的路由:资源:用户和资源:发布如果表单视图是从用户创建的,那么它将仅查找在资源:用户路由中具有 POST 动词的路由?还有编辑呢?它如何知道该表单是用于创建新记录还是仅用于编辑记录?
    • 它在路由文件中查找与 HTTP 动词和 URL /users 的第一个匹配项。 @Wasif Hossain 详细阐述了这一点以及它如何知道何时编辑。
    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多