我对以下两个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",但这并不能真正向我解释什么
任何启蒙都很好!
:url
传递给form_for
方法是可选的。当使用它创建新对象时:
# long-style:
form_for(@user, url: users_path)
# same thing, short-style (record identification gets used)
form_for(@user)
在短风格版本中,使用了一个名为记录识别的概念,基本上通过询问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|
在第一种情况下,form_for
助手检查@user
变量以查看其状态。用户可能是新记录(在这种情况下,表单指向带有POST*的/users
)或现有记录(带有PATCH的users/:id
)。它还可以根据变量的状态提供预先填充的输入。
第二种形式是在不需要模型的实例(或者模型甚至不存在)时使用的,而form_for
帮助程序只是为了方便。url
参数是显式设置的,因为默认情况下操作将指向当前URL,并且您希望它指向login_path
。
*从技术上讲,它们都是浏览器端的POST,Rails稍后会对它们进行区分