代码之家  ›  专栏  ›  技术社区  ›  Dex

Rails路由名称空间和表单

  •  77
  • Dex  · 技术社区  · 15 年前

      namespace :businesses do
        resources :registration
      end
    

    我的控制器位于business/registration\u controller的子目录中。

    def new
      @business = Business.new
    end
    

    form_for @business do |f| ... 但我得到了以下错误:

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

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

    undefined method 企业路径: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"}
    
    2 回复  |  直到 15 年前
        1
  •  175
  •   Voldy    11 年前

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

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

    namespace :admin do
      resources :businesses
    end
    

    观点:

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

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

    关于你的案子:

    在路线.rb一切正常。在视图中,您应该显式地编写url,因为控制器中除了controller name之外还有其他变量:

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

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

    还有一句话:我不会为注册新业务创建注册控制器。我认为将业务相关的操作保留在business_controller中会更清楚。

        2
  •  22
  •   fengd    13 年前

    实际上,我认为有更好的解决办法。

    form_for [:admin, @business]
    

    提供url的问题是,如果将表单抽象为部分视图,则需要处理“创建”和“更新”情况。它们指向不同的url,最后提供 @url