【问题标题】: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 稍后会区分它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-31
        • 2017-02-11
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2018-03-27
        • 1970-01-01
        相关资源
        最近更新 更多