我正在创建一个名为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 /路径,因为它没有指定要查找的路径?
答案 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中阅读所有相关内容。