7

У меня есть пользовательский контроллер регистрации, но я не хочу переопределять действие create из devise. Когда я пытаюсь зарегистрироваться пользователя, я получаю эту ошибку:Ruby on Rails: пользовательский контроллер регистрации объявлений, задающий вопрос о создании

Unknown action 

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

ли это просить за него, потому что у меня есть собственный контроллер регистрации? Если это так, значит ли это, что мне нужно скопировать все действия, которые я не переопределяю здесь: https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

Или это потому, что в моем приложении что-то не так?

Мои маршруты:

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 

Это мой Разрабатывают контроллер регистрации

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 

Это форма регистрации:

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

ответ

17

Ваш контроллер регистрации наследует от неправильного класса: DeviseController Это базовый класс для регистрации и h как метод «создать», а также ваш собственный класс Devise :: RegistrationsController (он имеет только методы редактирования и обновления) - он несет ошибку.

Для того, чтобы создать свой собственный контроллер пользовательских регистрации для пользователей с Откатом к оригинальным методам завещать, я предлагаю вам сделать следующее:
1. создать папку «пользователей» в папке контроллеров
2. создать там registrations_controller. гь файл, и определить класс есть:

Users::RegistrationsController < Devise::RegistrationsController 

и переопределить какие-либо действия ("редактировать" и "обновление")
3. сообщить файл "routes.rb" об изменениях:

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

Это работает. Почему он не может быть создан как имя папки? – hellomello

+0

на самом деле, я думаю, это может быть) , но я обычно следую за соглашениями об именах rails. У меня есть болезненный опыт отладки таких приложений: ошибки, как правило, находятся в очень неожиданных местах, и часто это единственная причина, по которой не соблюдалось какое-либо соглашение об именах , –

+2

@RoaringStones вам не хватает 's' и конец регистрации. Имя должно быть registrations_controller.rb – Ricbermo