7

Ho un controller di registrazione personalizzato, ma non voglio sovrascrivere un'azione di creazione di escogitare. Quando provo a registrare un utente, ottengo questo errore:Ruby on Rails: controller di registrazione personalizzato Devise, che chiede di creare un'azione

Unknown action 

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

E 'chiedere perché ho un controller di registrazione personalizzato? Se è così, vuol dire che devo copiare tutte le azioni che non escludo da qui: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

Oppure perché c'è qualcosa di sbagliato nella mia applicazione?

I miei itinerari:

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 

Questo è il mio escogitare regolatore di registrazione

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 

Questo è il modulo di registrazione:

<%= 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 %> 

risposta

17

Il controller di registrazione eredita dalla classe sbagliata: DeviseController È una classe base per una registrazione eh come nessun metodo "crea", e così pure la tua classe personalizzata Devise :: RegistrationsController (ha solo metodi di modifica e aggiornamento) - incorre nell'errore.

Al fine di creare il proprio controller di registrazione personalizzata per gli utenti con riduzione ai metodi testamentaria originali, vi consiglio di effettuare le seguenti operazioni: 1.
creare la cartella "utenti" nella cartella controllori
2. creare lì registrations_controller. file di RB, e definire classe ci:

Users::RegistrationsController < Devise::RegistrationsController 

e sovrascrivere eventuali azioni ("Modifica" e "update")
3. informare il file "routes.rb" sulle modifiche:

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

Questo funziona. Perché non può essere concepito come nome di una cartella? – hellomello

+0

in realtà, penso che possa essere) ma di solito seguo le convenzioni di denominazione delle barre perché ho avuto una dolorosa esperienza di debug di tali applicazioni: gli errori tendono ad essere in posti molto inaspettati e spesso l'unica ragione, che alcune convenzioni di denominazione non sono state seguite . –

+2

@RoaringStones mancano la "s" e la fine della registrazione. Il nome deve essere registrations_controller.rb – Ricbermo