rails不同的form_for参数用于不同的任务?

时间:2014-10-22 17:10:01

标签: ruby ruby-on-rails-4 railstutorial.org form-for

我有以下两个我很困惑的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",但这并不是'真的向我解释任何事情。

任何启蒙都会很好!

2 个答案:

答案 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稍后会区分它们。功能