Rails Маршрутизує простори імен та form_for


78

У моїх маршрутах є простір імен. 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 methodbusiness_path 'для # <#: 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"}

Чи можете ви розмістити вихідні дані про "рейкові маршрути"?
Богдан,

Відповіді:


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 Робота з просторами імен

Щодо вашої справи:

У маршрутах.rb все добре. У поданні ви повинні писати url явно, оскільки у вас є змінна в контролері, крім імені контролера:

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

Я припускаю, що у бізнесі / registration_controller у вас є щось подібне:

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

І одне зауваження: я б не створив реєстраційний_контролер для реєстрації нового бізнесу. Я думаю, що зберігати дії, пов’язані з бізнесом, у business_controller набагато зрозуміліше.


Так, це те, що я маю для контролера. Я насправді намагався, як ви запропонували, і я отримую undefined method business_businesses_path 'для # <# <Class: 0x103385d70>: 0x103384088> `
Dex

Я згоден! Однак мені знадобляться такі функції для підрозділу адміністратора. Можливо, це спрацює наступного разу.
Dex

У мене така ж помилка, я робив крок, я змусив його працювати, але переспрямування шукає "business_path", а не "admin_business_path" ... якісь думки?
Роберто

1
@ Роберто, можливо, вам доведеться вручну вказати admin_business_path? Спробувати redirect_to admin_business_path(@business)чи можливо redirect_to [:admin, @business]?
Dex

Чудово, можливо, вам слід перенести оновлення на початок вашої відповіді. Врятував би деяких людей (як я).
janosrusiczki

22

Насправді, я думаю, що є краще рішення.

form_for [:admin, @business]

проблема з наданням URL-адреси полягає в тому, що якщо ви абстрагуєте форму як частковий вигляд, вам доведеться мати справу зі ситуаціями "створення" та "оновлення". Вони вказують на різні URL-адреси, і в кінцевому підсумку надають @urlконтролер in.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.