I'm using Devise in a Rails 3 app, but in this case, a user must be created by an existing user, who determines what permissions he/she will have.
Because of this, I want:
- To remove the route for users to sign up.
- To still allow users to edit their profiles (change email address and password) after they have signed up
How can I do this?
Currently, I'm effectively removing this route by placing the following before devise_for :users
:
match 'users/sign_up' => redirect('/404.html')
That works, but I imagine there's a better way, right?
Update
As Benoit Garret said, the best solution in my case is to skip creating the registrations routes en masse and just create the ones I actually want.
To do that, I first ran rake routes
, then used the output to re-create the ones I wanted. The end result was this:
devise_for :users, :skip => [:registrations]
as :user do
get 'users/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'
put 'users' => 'devise/registrations#update', :as => 'user_registration'
end
Note that:
- I still have
:registerable
in myUser
model devise/registrations
handles updating email and password- Updating other user attributes - permissions, etc - is handled by a different controller
Actual answer:
Remove the route for the default Devise paths; i.e.:
devise_for :users, path_names: {
sign_up: ''
}
By changing the routes there are a whole bunch of other problems that come with that. The easiest method I have found is to do the following.
you can do this in your model
change it to:
notice that the symbol
:registerable
was removedThat's it, nothing else is required. All routes and links to registration page are magically removed too.
I found another post similar to this one and wanted to share an answer @chrisnicola gave. In the post they were attempting to only block user signup's during production.
You could also modify the registrations controller. You can use something like this:
In "app/controllers/registrations_controller.rb"
This will override devise's controller and use the above methods instead. They added flash messages incase that someone somehow made it to the sign_up page. You should also be able to change the redirect to any path you like.
Also in "config/routes.rb" you can add this:
Leaving it like this will allow you to use the standard devise edit your profile. If you wish you can still override the edit profile option by including
in the "app/controllers/registrations_controller.rb"
Do This in routes.rb
you will get an error now while you come to sign in page, to fix it. Do this change in: app/views/devise/shared/_links.erb
I liked @max's answer, but when trying to use it I ran into an error due to
devise_mapping
being nil.I modified his solution slightly to one that seems to address the issue. It required wrapping the call to
resource
insidedevise_scope
.Note that
devise_scope
expects the singular:user
whereasresource
expects the plural:users
.I had the same issue and I found it a bit bad practise to redirect users from the registration page. So my solution is basically is not using
:registrable
at all.What I did was to create a similar page like edit user details which looked like:
So this form submits into a new post end point that updates the password, which looks like:
Later on you can use the
@result
in your view to tell the user whether the password is updated or not.