Rails Routes Namespaces und form_for

78

Ich habe einen Namespace in meiner route.rb

  namespace :businesses do
    resources :registration
  end

Mein Controller befindet sich in einem Unterverzeichnis business / register_controller.

def new
  @business = Business.new
end

Meiner Ansicht nach möchte ich dies tun form_for @business do |f| ..., erhalte jedoch den folgenden Fehler:

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

Der Server wurde neu gestartet und ich erhalte auch Folgendes:

undefined methodbusiness_path 'für # <#: 0x10339bb20> `

Hier sind meine Rechenrouten:

                   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"}
Dex
quelle
Können Sie die Ausgabe "Rake-Routen" veröffentlichen?
Bohdan

Antworten:

177

Wenn Sie Routen mit Namespace haben, ist der beste Weg:

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

in route.rb:

namespace :admin do
  resources :businesses
end

Im Hinblick auf:

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

Die Dokumente: http://guides.rubyonrails.org/form_helpers.html Abschnitt 2.3.1 Umgang mit Namespaces

In Bezug auf Ihren Fall:

In route.rb ist alles in Ordnung. In der Ansicht sollten Sie die URL explizit schreiben, da Sie im Controller eine andere Variable als den Controller-Namen haben:

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

Ich nehme an, dass Sie in business / register_controller so etwas haben:

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

Und eine Bemerkung: Ich würde keinen Registrierungs-Controller für die Registrierung eines neuen Unternehmens erstellen. Ich denke, dass es viel klarer ist, geschäftsbezogene Aktionen in business_controller zu behalten.

Voldy
quelle
Ja, das habe ich für den Controller. Ich habe es tatsächlich versucht, wie Sie vorgeschlagen haben, und ich erhalte undefined method business_businesses_path 'für # <# <Class: 0x103385d70>: 0x103384088> `
Dex
Genau! Ich benötige diese Art von Funktionalität jedoch für einen Admin-Unterabschnitt. Vielleicht klappt es beim nächsten Mal.
Dex
Ich habe den gleichen Fehler, mache den Schritt, den ich zum Laufen gebracht habe, aber die Umleitung sucht nach "business_path" und nicht nach "admin_business_path" ... irgendwelche Gedanken?
Roberto
1
@ Roberto, müssen Sie möglicherweise den admin_business_path manuell angeben? Versuchen Sie es redirect_to admin_business_path(@business)oder vielleicht redirect_to [:admin, @business]?
Dex
Ausgezeichnet, vielleicht sollten Sie das Update an den Anfang Ihrer Antwort verschieben. Würde einigen Leuten (wie mir) etwas Zeit sparen.
Janosrusiczki
22

Eigentlich denke ich, dass es eine bessere Lösung gibt.

form_for [:admin, @business]

Das Problem beim Angeben einer URL besteht darin, dass Sie sich mit Situationen zum Erstellen und Aktualisieren befassen müssen, wenn Sie das Formular als Teilansicht abstrahieren. Sie verweisen auf verschiedene URLs und stellen am Ende den @urlIn-Controller bereit .

fengd
quelle
@ Rex, das ist redirect_to
fengd