我有以下两个我很困惑的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",但这并不是'真的向我解释任何事情。
任何启蒙都会很好!
答案 0 :(得分:2)
在处理模型对象时,将: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|
答案 1 :(得分:0)
在第一种情况下,form_for
助手会检查@user
变量以查看其状态。用户可能是新记录(在这种情况下,表单指向带有POST *的/users
)或现有记录(users/:id
带有PATCH)。它还可以根据变量的状态提供预填充输入。
当不需要模型实例(或者模型甚至不存在)时使用第二种形式,并且仅为方便起见使用form_for
助手。 url
参数是显式设置的,因为默认情况下,操作会指向当前网址,您希望它指向login_path
。
*从技术上讲,它们都是浏览器端的POST,Rails稍后会区分它们。功能