form_for如何知道单击提交按钮时要转到的URL /路径?

时间:2017-05-07 01:59:49

标签: ruby-on-rails

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

<%= 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 /路径,因为它没有指定要查找的路径?

2 个答案:

答案 0 :(得分:3)

除了Amr El Bakry's answer之外,让我帮助你揭开form_for辅助方法背后的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)

对于这两种情况,您都可以清楚地看到短格式相同的。 通过调用@user.persisted?,记录识别足够聪明,可以找出如果记录是新记录还是现有记录

您可能有兴趣在line 462 form_helper.rb 内的form_for定义中断言这一事实​​!

希望它有所帮助!

答案 1 :(得分:2)

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

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