[ruby-on-rails] Rails Routes 네임 스페이스 및 form_for

내 route.rb에 네임 스페이스가 있습니다.

  namespace :businesses do
    resources :registration
  end

내 컨트롤러는 business / 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"}



답변

네임 스페이스가있는 경로가있는 경우 가장 좋은 방법은 다음과 같습니다.

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

route.rb에서 :

namespace :admin do
  resources :businesses
end

보기 :

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

문서 : http://guides.rubyonrails.org/form_helpers.html 섹션 2.3.1 네임 스페이스 다루기

귀하의 경우 :

route.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에서 비즈니스 관련 작업을 유지하는 것이 훨씬 더 명확하다고 생각합니다.


답변

사실 더 나은 해결책이 있다고 생각합니다.

form_for [:admin, @business]

URL 제공의 문제는 양식을 부분보기로 추상화하면 “만들기”및 “업데이트”상황을 처리해야한다는 것입니다. 그들은 다른 URL을 가리키고 @url컨트롤러 를 제공하는 것으로 끝납니다 .


답변