为不同的任务跟踪不同的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",但这并不能真正向我解释什么

任何启蒙都很好!

处理模型对象时,将: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稍后会对它们进行区分

最新更新