7

Mam niestandardowy kontroler rejestracji, ale nie chcę przesłonić akcji tworzenia od opracowania. Kiedy próbuję zarejestrować użytkownika, pojawia się następujący błąd:Ruby on Rails: niestandardowy kontroler rejestracji Devise, z prośbą o utworzenie akcji

Unknown action 

The action 'create' could not be found for Devise::RegistrationsController 

Czy to jest pytanie, ponieważ mam niestandardowy kontroler rejestracji? Jeśli tak, czy to znaczy, że muszę skopiować wszystkie działania, które nie są nadrzędne z tego: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

Albo dlatego, że coś jest nie tak z moją aplikacją?

Moje trasy:

devise_for :user, :controllers => { :registrations => "devise/registrations" }, :skip => [:sessions] do 
    get 'signup' => 'devise/registrations#new', :as => :new_user_registration 
    post 'signup' => 'devise/registrations#create', :as => :user_registration 
    end 

To jest mój Devise kontroler rejestracja

class Devise::RegistrationsController < DeviseController 

    skip_before_filter :require_no_authentication 

    def edit 
    @user = User.find(current_user.id) 
    @profile = Profile.new 
    end 

    def update 
    # required for settings form to submit when password is left blank 
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank? 
     params[:user].delete(:password) 
     params[:user].delete(:password_confirmation) 
    end 

    @user = User.find(current_user.id) 
    if @user.update_attributes(params[:user]) 
     set_flash_message :notice, :updated 
     # Sign in the user bypassing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to after_update_path_for(@user) 
    else 
     render "edit" 
    end 

    end 


    protected 
    def after_update_path_for(resource) 
     user_path(resource) 
    end 

    def after_sign_up_path_for(resource) 
     user_path(resource) 
    end 

end 

Jest to formularz rejestracyjny:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
... 
    <div> 
    <%= button_tag :type => :submit, :class => "btn btn-large btn-inverse" do %> 
    Sign up 
    <% end %> 
    </div> 
... 
<% end %> 

Odpowiedz

17

Kontroler rejestracji dziedziczy z niewłaściwej klasy: DeviseController Jest to klasa podstawowa do rejestracji i h nie ma metody "create", podobnie jak twoja niestandardowa klasa Devise :: RegistrationsController (ma tylko metody edycji i aktualizacji) - powoduje błąd.

Aby stworzyć swój własny kontroler zwyczaj rejestracji dla użytkowników z awaryjnej do oryginalnych metod opracowania, proponuję wykonać następujące czynności: 1.
utworzyć folder „Użytkownicy” w folderze sterowników
2. Utwórz tam registrations_controller. rb pliku i określić klasę tam:

Users::RegistrationsController < Devise::RegistrationsController 

i zastępują żadnych działań ("edit" i "update")
3. informuje "routes.rb" plik o zmianach:

devise_for :users, :controllers => { registrations: 'users/registrations' } 
+0

To działa. Dlaczego nie można go wymyślić jako nazwy folderu? – hellomello

+0

w rzeczywistości, myślę, że może być), ale zazwyczaj podążam za konwencjami nazewnictwa szyn, ponieważ mam bolesne doświadczenie w debugowaniu takich aplikacji: błędy zdają się być w bardzo nieoczekiwanych miejscach i często jedynym powodem, dla którego nie przestrzegano konwencji nazewnictwa . –

+2

@RoaringStones brakuje "s" i końca rejestracji. Nazwa musi być registrations_controller.rb – Ricbermo