7

Ich habe einen benutzerdefinierten Registrierungs-Controller, aber ich möchte keine Erstellungsaktion von Devise überschreiben. Wenn ich versuche, um einen Benutzer zu registrieren, ich diesen Fehler:Ruby on Rails: Benutzerdefinierter Registrierungs-Controller, der nach einer Aktion fragt

Unknown action 

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

Ist es für sie zu fragen, weil ich einen benutzerdefinierten Registrierungscontroller haben? Wenn ja, bedeutet das, dass ich alle Aktionen kopieren muss, die ich hier nicht überschreibe: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

Oder ist es, weil etwas mit meiner Anwendung nicht stimmt?

Meine Routen:

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 

Dies ist meine devise Registrierungscontroller

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 

Dies ist das Anmeldeformular ist:

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

Antwort

17

Ihre Steuerung der Registrierung von der falschen Klasse erbt: DeviseController Es ist eine Basisklasse für eine Registrierung und h als keine "create" -Methode, und das gilt auch für Ihre benutzerdefinierte Devise :: RegistrationsController-Klasse (sie hat nur Bearbeitungs- und Aktualisierungsmethoden) - sie verursacht den Fehler.

Um Ihre eigenen Registrierungscontroller für Benutzer mit Rückfall auf den ursprünglichen devise Methoden zu erstellen, empfehle ich Ihnen Folgendes tun:
1. Ordner
2. schaffen es registrations_controller Ordner „Benutzer“ in-Controller erstellen. rb-Datei und definieren Klasse gibt:

Users::RegistrationsController < Devise::RegistrationsController 

und überschreiben alle Aktionen ("bearbeiten" und "update")
3. informieren die "routes.rb" Datei über die Änderungen:

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

Das funktioniert. Warum kann es nicht als Ordnername entworfen werden? – hellomello

+0

tatsächlich, ich denke, es kann sein) aber ich folge in der Regel Schienen Benennungskonventionen für habe ich eine schmerzhafte Erfahrung des Debuggens solcher Anwendungen: Fehler sind in der Regel in sehr unerwarteten Orten und oft der einzige Grund, dass einige Namenskonvention nicht befolgt wurde . –

+2

@RoaringStones Sie vermissen das 's' und das Ende der Registrierung. Der Name muss registrations_controller.rb sein – Ricbermo