Rails路线命名空间和form_for


78

我的routes.rb中有名称空间

  namespace :businesses do
    resources :registration
  end

我的控制器位于业务/ registration_controller子目录中。

def new
  @business = Business.new
end

在我看来,我想这样做,form_for @business do |f| ...但是出现以下错误:

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

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

undefined method#<#:0x10339bb20>的“ business_path”

这是我的耙路:

                   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"}

您可以发布“耙路”输出吗?
Bohdan

Answers:


177

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

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中,一切正常。在视图中,您应该显式地编写url,因为您在控制器中具有控制器名称以外的变量:

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

我想在business / registration_controller中,您会看到以下内容:

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

还有一个要点:我不会创建用于注册新业务的registration_controller。我认为将与业务相关的动作保留在business_controller中更加清楚。


是的,这就是控制器的功能。我真的试图如你所说,我得到undefined method businesses_businesses_path”为#<#<类别:0x103385d70>:0x103384088>`
地塞米松

我同意!但是,对于“管理”子部分,我将需要这种类型的功能。也许下次可以使用。
Dex 2010年

我有同样的错误,执行我要执行的步骤,但是重定向查找“ business_path”而不是“ admin_business_path” ...有什么想法吗?
罗伯托

1
@Roberto,您可能需要手动指定admin_business_path?尝试redirect_to admin_business_path(@business)还是也许redirect_to [:admin, @business]
Dex

太好了,也许您应该将更新移至答案的顶部。可以节省一些人(像我一样)的时间。
janosrusiczki 2012年

22

实际上,我认为有更好的解决方案。

form_for [:admin, @business]

提供网址的问题在于,如果您将表单抽象为部分视图,则需要处理“创建”和“更新”情况。它们指向不同的URL,最后提供@urlin控制器。


@Dex,即redirect_to
fengd 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.