Rails路由命名空间和form_for

我有我的routes.rb命名空间

namespace :businesses do resources :registration end 

我的控制器在一个子目录business / registration_controller。

 def new @business = Business.new end 

在我看来,我想做这个form_for @business do |f| ... form_for @business do |f| ...但我收到以下错误:

No route matches {:controller=>"businesses", :action=>"create"}

重新启动服务器,我也得到这个:

undefined method business_path'for#<#:0x10339bb20>`

这里是我的耙路线:

  home_index GET /home/index(.:format) {:action=>"index", :controller=>"home"} new_user_session GET /users/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"} user_session POST /users/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"} destroy_user_session GET /users/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"} user_password POST /users/password(.:format) {:action=>"create", :controller=>"devise/passwords"} new_user_password GET /users/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"} edit_user_password GET /users/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"} user_password PUT /users/password(.:format) {:action=>"update", :controller=>"devise/passwords"} cancel_user_registration GET /users/cancel(.:format) {:action=>"cancel", :controller=>"devise/registrations"} user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"} new_user_registration GET /users/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"} edit_user_registration GET /users/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"} user_registration PUT /users(.:format) {:action=>"update", :controller=>"devise/registrations"} user_registration DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"} users GET /users(.:format) {:action=>"index", :controller=>"users"} users POST /users(.:format) {:action=>"create", :controller=>"users"} new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"} edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"} user GET /users/:id(.:format) {:action=>"show", :controller=>"users"} user PUT /users/:id(.:format) {:action=>"update", :controller=>"users"} user DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"} full_tree_admin_categories GET /admin/categories/full_tree(.:format) {:action=>"full_tree", :controller=>"admin/categories"} admin_categories GET /admin/categories(.:format) {:action=>"index", :controller=>"admin/categories"} admin_categories POST /admin/categories(.:format) {:action=>"create", :controller=>"admin/categories"} new_admin_category GET /admin/categories/new(.:format) {:action=>"new", :controller=>"admin/categories"} edit_admin_category GET /admin/categories/:id/edit(.:format) {:action=>"edit", :controller=>"admin/categories"} admin_category GET /admin/categories/:id(.:format) {:action=>"show", :controller=>"admin/categories"} admin_category PUT /admin/categories/:id(.:format) {:action=>"update", :controller=>"admin/categories"} admin_category DELETE /admin/categories/:id(.:format) {:action=>"destroy", :controller=>"admin/categories"} businesses_registration_index GET /businesses/registration(.:format) {:action=>"index", :controller=>"businesses/registration"} businesses_registration_index POST /businesses/registration(.:format) {:action=>"create", :controller=>"businesses/registration"} new_businesses_registration GET /businesses/registration/new(.:format) {:action=>"new", :controller=>"businesses/registration"} edit_businesses_registration GET /businesses/registration/:id/edit(.:format) {:action=>"edit", :controller=>"businesses/registration"} businesses_registration GET /businesses/registration/:id(.:format) {:action=>"show", :controller=>"businesses/registration"} businesses_registration PUT /businesses/registration/:id(.:format) {:action=>"update", :controller=>"businesses/registration"} businesses_registration DELETE /businesses/registration/:id(.:format) {:action=>"destroy", :controller=>"businesses/registration"} root /(.:format) {:action=>"index", :controller=>"home"} 

如果你有命名空间的路线,最好的方法是:

 class Admin::BusinessesController < ApplicationController def new @business = Business.new end end 

在routes.rb中:

 namespace :admin do resources :businesses end 

鉴于:

 form_for [:admin, @business] do |f|... 

文档: http : //guides.rubyonrails.org/form_helpers.html第2.3.1节处理命名空间

关于你的情况:

在routes.rb中,一切都是o'k。 在视图中,您应该明确地写入url,因为在控制器名称以外的其他控制器中有variables:

 form_for @business, :url => business_registration_path do |f|... 

我想在企业/ registration_controller你有这样的事情:

 class Businesses::RegistrationController < ApplicationController def new @business = Business.new end end 

还有一点意见:我不会创buildregistration_controller注册一个新的业务。 我认为在business_controller中保持业务相关的行为要清楚得多。

其实我觉得有一个更好的解决办法

 form_for [:admin, @business] 

给url的问题是,如果您将表单抽象为局部视图,则需要处理“创build”和“更新”情况。 他们指向不同的URL,最后在控制器中提供@url