设置此form_for的正确语法是什么?

时间:2012-06-13 14:24:44

标签: ruby-on-rails

这有点复杂。但是我有命名空间路由,这个表单正在处理由两个不同控制器共享的Customer模型。

我的路线:

namespace "self_service" do
  resources :customers

我在实例化编辑表单时的糟糕尝试

= form_for [:self_service, @current_customer], action: 'update', method: :put do |f|

我的控制器

class SelfService::CustomersController < SelfService::BaseController
  layout 'self_service'

  def edit
  end

  def update
  end
end

这个实例化做了两件错误的事情:

  1. 表单的网址为/customers/146/self_service。但不应该是相反的方式吗?不应该是self_service/customers/146/

  2. 当我点击提交时,我会收到No route matches "/customers/146/self_service"

  3. 更新

    事实证明,这......:

    resources :customers do
      member do
        get :self_service
    

    ..与此相矛盾:

      namespace "self_service" do
        resources :customers
      end
    
    但是,让我困扰的是......为什么他们互相矛盾呢?一个应该是:

    customers/:id/self_service
    

    另一个是:

    self_service/customers/:id
    

1 个答案:

答案 0 :(得分:1)

您使用的语法是嵌套资源。您不需要在form_for中指定命名空间。尝试:

= form_for @current_customer do |f|

- 编辑 -

我的错误。但根据答案here,你所做的似乎是正确的。你能试试吗,

= form_for [:self_service, @current_customer] do |f|

并在您的路线中,使用符号而不是字符串,即

namespace :self_service do
  resources :customers
end

不确定这是否有效,但值得一试。

- 编辑2 -

我还设置了一个带有命名空间资源的虚拟项目here。我使用了rails scaffold generator,这就是它产生的。它根据需要创建表单。您可以将此作为示例。