【问题标题】:rails different form_for parameters for different tasks?为不同的任务提供不同的form_for参数?
【发布时间】:2014-10-23 01:40:11
【问题描述】:
我对以下两个 form_for() 感到困惑。
# form for users
form_for(@user) do |f|
# form for sessions
form_for(:sessions, url: login_path) do |f|
我知道第一个是简单地遍历所有用户并输入表单。我不知道为什么当你创建一个新会话时,form_for 的参数是这样列出的。为什么会有登录路径?
Michael Hartl 将其解释为“在会话的情况下,我们需要指出资源的名称和相应的 URL”,但这并没有真正向我解释任何事情。
任何启示都会很好!
【问题讨论】:
标签:
ruby
ruby-on-rails-4
railstutorial.org
form-for
【解决方案1】:
在处理模型对象时,将:url 传递给form_for 方法是可选的。使用它创建新对象时:
# long-style:
form_for(@user, url: users_path)
# same thing, short-style (record identification gets used)
form_for(@user)
在短版中使用了一个叫做记录识别的概念,基本上rails通过询问record.new_record?来确定记录是否是新的,它还根据对象的类,在本例中为 @user.class
在更新现有对象时使用form_for 时也适用相同的原则。在这种情况下,record.new_record? 返回 false,rails 认为它必须将表单提交给控制器的 update 操作。
如果使用上述机制的rails无法确定表单必须提交的路径,则必须显式提供url。这也适用于定义单一资源(例如resource :geocoder)时。为单数路由创建表单时,必须指定 URL:
form_for @geocoder, url: geocoder_path do |f|
【解决方案2】:
在第一种情况下,form_for 助手检查@user 变量以查看其状态。用户可能是一条新记录(在这种情况下,表单指向带有 POST* 的 /users)或现有记录(带有 PATCH 的users/:id)。它还可以根据变量的状态提供预填充的输入。
当不需要模型的实例(或者模型甚至不存在)时使用第二种形式,并且 form_for 帮助器只是为了方便而使用。 url 参数是显式设置的,因为默认情况下该操作将指向当前 URL,而您希望它指向 login_path。
*从技术上讲,它们都是浏览器端的 POST,Rails 稍后会区分它们。