这有点复杂。但是我有命名空间路由,这个表单正在处理由两个不同控制器共享的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
这个实例化做了两件错误的事情:
表单的网址为/customers/146/self_service
。但不应该是相反的方式吗?不应该是self_service/customers/146/
?
当我点击提交时,我会收到No route matches "/customers/146/self_service"
更新
事实证明,这......:
resources :customers do
member do
get :self_service
..与此相矛盾:
namespace "self_service" do
resources :customers
end
但是,让我困扰的是......为什么他们互相矛盾呢?一个应该是:
customers/:id/self_service
另一个是:
self_service/customers/:id
答案 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,这就是它产生的。它根据需要创建表单。您可以将此作为示例。