Câu hỏi Rails Routes Namespaces và form_for


Tôi có không gian tên trong routes.rb của tôi

  namespace :businesses do
    resources :registration
  end

Bộ điều khiển của tôi nằm trong một thư mục con doanh nghiệp / registration_controller.

def new
  @business = Business.new
end

Theo quan điểm của tôi, tôi muốn làm điều này form_for @business do |f| ... nhưng tôi nhận được lỗi sau:

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

Khởi động lại máy chủ và tôi cũng nhận được điều này:

undefined methodenterprises_path 'cho # <#: 0x10339bb20> `

Dưới đây là các tuyến đường cào của tôi:

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

76
2017-10-04 08:05


gốc


Bạn có thể đăng đầu ra "rake route" không? - Bohdan


Các câu trả lời:


Nếu bạn có các tuyến đường không gian tên, cách tốt nhất là:

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

trong routes.rb:

namespace :admin do
  resources :businesses
end

Theo quan điểm:

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

Tài liệu: http://guides.rubyonrails.org/form_helpers.html phần 2.3.1 Xử lý không gian tên

Về trường hợp của bạn:

Trong routes.rb mọi thứ đều là o'k. Trong giao diện, bạn nên viết url một cách rõ ràng bởi vì bạn có biến trong bộ điều khiển khác với tên bộ điều khiển:

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

Tôi cho rằng trong các doanh nghiệp / register_controller bạn có một cái gì đó như thế này:

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

Và một nhận xét: Tôi sẽ không tạo register_controller để đăng ký một doanh nghiệp mới. Tôi nghĩ rằng việc giữ các hành động liên quan đến kinh doanh trong business_controller là rõ ràng hơn nhiều.


163
2017-10-04 08:52



Vâng, đó là những gì tôi có cho bộ điều khiển. Tôi thực sự đã cố gắng như bạn gợi ý và tôi nhận được undefined method enterprises_businesses_path 'cho # <# <Lớp: 0x103385d70>: 0x103384088> ` - Dex
Tôi đồng ý! Tuy nhiên, tôi sẽ cần loại chức năng này cho phần phụ Quản trị viên. Có lẽ nó sẽ làm việc lần sau. - Dex
Đã cập nhật câu trả lời :) - Voldy
Im có lỗi tương tự, làm bước tôi đã nhận nó để làm việc, nhưng chuyển hướng tìm "business_path" và không "admin_business_path" ... bất kỳ suy nghĩ? - Roberto
@Roberto, Bạn có thể cần xác định bằng tay admin_business_path? Thử redirect_to admin_business_path(@business) hoặc có thể redirect_to [:admin, @business]? - Dex


Trên thực tế, tôi nghĩ rằng có một giải pháp tốt hơn.

form_for [:admin, @business]

vấn đề với việc đưa ra một url là nếu bạn trừu tượng biểu mẫu ra dưới dạng xem một phần, bạn sẽ cần phải đối phó với các tình huống "tạo" và "cập nhật". Chúng trỏ đến các url khác nhau và kết thúc bằng việc cung cấp @url trong bộ điều khiển.


21
2017-12-26 06:12



Đây là một phần của giải pháp của Voldy. Dòng cuối cùng. - Dex
@Dex, đó là redirect_to - fengd