devise overriding registrations controller - unini

2019-02-11 23:11发布

问题:

I'm trying to override some the functionality of the default devise registrations controller so that only certain users can create accounts for others. So in a file called registrations_controller.rb under the controllers/users folder I have the following

class Users::RegistrationsController < Devise::RegistrationsController

  before_filter :check_permissions, :only => [:new, :create, :cancel]
  skip_before_filter :require_no_authentication

  def check_permissions
    authorize! :create, resource
  end
end

and in my routes file I have

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

When I try to go to the users/sign_up url I get a a routing error 'uninitialized constant Users::RegistrationsController'.

So what is really weirding me out about this is that I had used pretty much exactly the same functionality in a rails 3 app without a problem. I had a look at some of the other stackoveflow questions similar to this and I'm still none the wiser. The app I'm building now is a rails 3.1 app and I'm using devise 1.5.1

Here are the relevant routes it case they useful

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 DELETE /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"}
                                      PUT    /users/password(.:format)                                   {:action=>"update", :controller=>"devise/passwords"}
             cancel_user_registration GET    /users/cancel(.:format)                                     {:action=>"cancel", :controller=>"users/registrations"}
                    user_registration POST   /users(.:format)                                            {:action=>"create", :controller=>"users/registrations"}
                new_user_registration GET    /users/sign_up(.:format)                                    {:action=>"new", :controller=>"users/registrations"}
               edit_user_registration GET    /users/edit(.:format)                                       {:action=>"edit", :controller=>"users/registrations"}
                                      PUT    /users(.:format)                                            {:action=>"update", :controller=>"users/registrations"}
                                      DELETE /users(.:format)                                            {:action=>"destroy", :controller=>"users/registrations"}

回答1:

I would say, there's something wrong at your filename.

Your file should be called users/registrations_controller.rb

That works for me.



回答2:

Where was your registrations_controller.rb saved to? The location is important. I found that I was making a mistake saving it to app/controllers/devise/.. It simply needed to be saved in app/controllers/. e.g.:

app/controllers/registrations_controller.rb


Also, config/routes.rb route should be defined as:

devise_for :users, controllers: { registrations: 'registrations' }



回答3:

I tried the same setup that you put here but it worked for me. I uploaded the application to github (I uploaded the log as well, so you can see that it really worked).

Double check for possible typos. Maybe you forgot a plural or there is a typo on a Class name.



回答4:

Hi I just recently added first name and last name to my registration. I am using Rails 4.

I used the following instructions/tutorial to get this done:

http://www.jacopretorius.net/2014/03/adding-custom-fields-to-your-devise-user-model-in-rails-4.html.

:)



回答5:

If you has been generate the views Move view files

I assume you already use rails generate devise:views generated devise views. Move views/devise/registrations folder to views/users , I think you also you should change the _path in the forms



回答6:

Do rails routes and check your routes in config/routes you might have a typo in your routes.

Instead of registrationS#new you might have something else like registration#new.