link_to update a Devise user, method => put - ruby-on-rails-3

I'm trying to update a single databasefield of my current_user (devise).
I want to do this just with the link_to helper:
<%= link_to "Grid", edit_user_registration_path(current_user, :project_view => "grid"), :method => :put %>
But I can't get it to work since the result it allways an error:
Routing Error
No route matches [PUT] "/users/edit.1"
My Routes for Devise:
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
What's wrong with the routing? I'm using devise without any custom modifications.
Thanks!

Wrong path helper:
$ rake routes
new_user_registration GET ... registrations#new
cancel_user_registration GET ... registrations#cancel
user_registration POST ... registrations#create
edit_user_registration GET ... registrations#edit
users PUT ... registrations#update # You want this one
DELETE ... registrations#destroy
Result:
<%= link_to "Grid", users_path(:user => {:project_view => 'grid'}), :method => :put, :confirm => "Are you sure?" %>
Update for your specific routes:
<%= link_to "Grid", registration_path(resource_name, :user => {:project_view => 'grid'}), :method => :put, :confirm => "Are you sure?" %>

Related

no route matches controller (Rails 3)

I'm pretty new to RoR, please help me identify where I am wrong
I get the following error
Routing Error
No route matches {:controller=>"groups"}
Try running rake routes for more information on available routes
when trying to render the following view
<li><%= link_to 'My groups', user_groups_path %></li>
<li><%= link_to 'New group', new_user_group_path %></li>
and here is 'routes.rb' and rake routes output
devise_for :users
resources :users do |user|
resources :groups do |group|
resources :people do |person|
end
end
end
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session GET /users/sign_out(.:format) devise/sessions#destroy
user_password POST /users/password(.:format) devise/passwords#create
new_user_password GET /users/password/new(.:format) devise/passwords#new
edit_user_password GET /users/password/edit(.:format) devise/passwords#edit
PUT /users/password(.:format) devise/passwords#update
cancel_user_registration GET /users/cancel(.:format) devise/registrations#cancel
user_registration POST /users(.:format) devise/registrations#create
new_user_registration GET /users/sign_up(.:format) devise/registrations#new
edit_user_registration GET /users/edit(.:format) devise/registrations#edit
PUT /users(.:format) devise/registrations#update
DELETE /users(.:format) devise/registrations#destroy
user_group_people GET /users/:user_id/groups/:group_id/people(.:format) people#index
POST /users/:user_id/groups/:group_id/people(.:format) people#create
new_user_group_person GET /users/:user_id/groups/:group_id/people/new(.:format) people#new
edit_user_group_person GET /users/:user_id/groups/:group_id/people/:id/edit(.:format) people#edit
user_group_person GET /users/:user_id/groups/:group_id/people/:id(.:format) people#show
PUT /users/:user_id/groups/:group_id/people/:id(.:format) people#update
DELETE /users/:user_id/groups/:group_id/people/:id(.:format) people#destroy
groups GET /users/:user_id/groups(.:format) groups#index
POST /users/:user_id/groups(.:format) groups#create
new_user_group GET /users/:user_id/groups/new(.:format) groups#new
edit_user_group GET /users/:user_id/groups/:id/edit(.:format) groups#edit
user_group GET /users/:user_id/groups/:id(.:format) groups#show
PUT /users/:user_id/groups/:id(.:format) groups#update
DELETE /users/:user_id/groups/:id(.:format) groups#destroy
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
here is 'model.rb'
class User < ActiveRecord::Base
has_many :groups
class Group < ActiveRecord::Base
belongs_to :user
has_many :people
please help me figure out how to fix the problem
many thanks.
UPD
here is solution, it works
I made all changes suggested by #Abibullah and two changes in controllers
view:
<li><%= link_to 'My groups', user_groups_path(current_user) %></li>
<li><%= link_to 'New group', new_user_group_path(current_user) %></li>
routes.rb
resources :users do |user|
resources :groups do |group|
resources :people
end
end
devise_for :users
GroupsController.rb:
def index
#user = current_user
#user.groups = Group.all
was:
def index
#user = current_user
#groups = Group.all
end
UsersController.rb
class Devise::UsersController < DeviseController
def show
end
end
To Create a nested Group Inside User, U need to pass the user_id inside which U are Creating the Group.
For Ex: If I have user1
Then I will use the routes as this:
link_to 'My groups', user_groups_path(user1)
OR
link_to 'My groups', user_groups_path(user1.id)
AND
link_to 'My Group', new_user_group_path(user1)
OR
link_to 'My Group', new_user_group_path(user1.id)
This is to tell that, To which User you are creating the Group.
If U want to access any specific Group, say for ex: grp1
then My url will be
link_to 'My Group', user_group_path(user1, grp1)
THis is a good refrence for routing.
http://guides.rubyonrails.org/routing.html
I think it's obvious. You've got a typo in your
<li><%= link_to 'My groups', user_groups_path %></li>
link. The path should be user_group_path (without the 's') as shown in your rake routes output, instead of the one you've written in your link.

Rails3 Routing Problem

I keep getting this error when trying to view a page.
ActionView::Template::Error (No route
matches {:controller=>"classifieds",
:action=>"edit", :id=>#}):
40: <%= h classified.category.name
%>
41: <%= h classified.subcategory.name
%>
42: <%= h classified.status %>
43: <%= link_to "Edit",
edit_classified_path(classified)%>
44: <%= link_to 'Destroy', classified,
:confirm => 'Are you sure?', :method
=> :delete %>
45: <%= check_box_tag 'remove[id][]',
classified.id, false %>
46:
routes file
Rails3::Application.routes.draw do
resources :main, :categories, :cities, :users, :subcategories, :classifieds
resource :user
root :to => 'main#index'
match ':controller(/:action(/:id(.:format)))'
# route for simple captcha
match '/simple_captcha/:action', :controller => 'simple_captcha'
#admin logout
match '/logout', :controller=>'users', :action=>'destroy'
match '/login', :controller=>'users', :action=>'show'
match '/adminsearch', :controller=>'classifieds', :action=>'adminsearch'
#search
match '/mainsearch', :controller=>'main', :action=>'mainsearch'
match '/:permalink_1/categorysearch', :controller=>'main', :action=>'categorysearch'
match '/contactadvertiser', :controller=>'main', :action=>'contactadvertiser'
#city page
match '/:permalink_1', :controller => 'main', :action => 'city'
match '/edit', :controller => 'cities', :action => 'edit'
#activate, edit classifieds
match '/activate/:activation_code', :controller => 'main', :action => 'activate'
match '/edit/:activation_code', :controller => 'classifieds', :action => 'edit'
match '/update/:activation_code', :controller => 'classifieds', :action => 'update'
match '/delete/:activation_code', :controller => 'classifieds', :action => 'destroy'
match '/classifieds/multidelete', :controller=>'classifieds', :action=>'delete_multiple'
#category page
match '/:permalink_1/:permalink_2', :controller => 'main', :action => 'category'
#ad page
match '/:permalink_1/:permalink_2/:permalink_3', :controller => 'classifieds', :action => 'show'
end
rake routes:
main_index GET /main(.:format) {:controller=>"main", :action=>"index"}
POST /main(.:format) {:controller=>"main", :action=>"create"}
new_main GET /main/new(.:format) {:controller=>"main", :action=>"new"}
edit_main GET /main/:id/edit(.:format) {:controller=>"main", :action=>"edit"}
main GET /main/:id(.:format) {:controller=>"main", :action=>"show"}
PUT /main/:id(.:format) {:controller=>"main", :action=>"update"}
DELETE /main/:id(.:format) {:controller=>"main", :action=>"destroy"}
categories GET /categories(.:format) {:controller=>"categories", :action=>"index"}
POST /categories(.:format) {:controller=>"categories", :action=>"create"}
new_category GET /categories/new(.:format) {:controller=>"categories", :action=>"new"}
edit_category GET /categories/:id/edit(.:format) {:controller=>"categories", :action=>"edit"}
category GET /categories/:id(.:format) {:controller=>"categories", :action=>"show"}
PUT /categories/:id(.:format) {:controller=>"categories", :action=>"update"}
DELETE /categories/:id(.:format) {:controller=>"categories", :action=>"destroy"}
cities GET /cities(.:format) {:controller=>"cities", :action=>"index"}
POST /cities(.:format) {:controller=>"cities", :action=>"create"}
new_city GET /cities/new(.:format) {:controller=>"cities", :action=>"new"}
edit_city GET /cities/:id/edit(.:format) {:controller=>"cities", :action=>"edit"}
city GET /cities/:id(.:format) {:controller=>"cities", :action=>"show"}
PUT /cities/:id(.:format) {:controller=>"cities", :action=>"update"}
DELETE /cities/:id(.:format) {:controller=>"cities", :action=>"destroy"}
users GET /users(.:format) {:controller=>"users", :action=>"index"}
POST /users(.:format) {:controller=>"users", :action=>"create"}
new_user GET /users/new(.:format) {:controller=>"users", :action=>"new"}
edit_user GET /users/:id/edit(.:format) {:controller=>"users", :action=>"edit"}
user GET /users/:id(.:format) {:controller=>"users", :action=>"show"}
PUT /users/:id(.:format) {:controller=>"users", :action=>"update"}
DELETE /users/:id(.:format) {:controller=>"users", :action=>"destroy"}
subcategories GET /subcategories(.:format) {:controller=>"subcategories", :action=>"index"}
POST /subcategories(.:format) {:controller=>"subcategories", :action=>"create"}
new_subcategory GET /subcategories/new(.:format) {:controller=>"subcategories", :action=>"new"}
edit_subcategory GET /subcategories/:id/edit(.:format) {:controller=>"subcategories", :action=>"edit"}
subcategory GET /subcategories/:id(.:format) {:controller=>"subcategories", :action=>"show"}
PUT /subcategories/:id(.:format) {:controller=>"subcategories", :action=>"update"}
DELETE /subcategories/:id(.:format) {:controller=>"subcategories", :action=>"destroy"}
classifieds GET /classifieds(.:format) {:controller=>"classifieds", :action=>"index"}
POST /classifieds(.:format) {:controller=>"classifieds", :action=>"create"}
new_classified GET /classifieds/new(.:format) {:controller=>"classifieds", :action=>"new"}
edit_classified GET /classifieds/:id/edit(.:format) {:controller=>"classifieds", :action=>"edit"}
classified GET /classifieds/:id(.:format) {:controller=>"classifieds", :action=>"show"}
PUT /classifieds/:id(.:format) {:controller=>"classifieds", :action=>"update"}
DELETE /classifieds/:id(.:format) {:controller=>"classifieds", :action=>"destroy"}
POST /user(.:format) {:controller=>"users", :action=>"create"}
GET /user/new(.:format) {:controller=>"users", :action=>"new"}
GET /user/edit(.:format) {:controller=>"users", :action=>"edit"}
GET /user(.:format) {:controller=>"users", :action=>"show"}
PUT /user(.:format) {:controller=>"users", :action=>"update"}
DELETE /user(.:format) {:controller=>"users", :action=>"destroy"}
root /(.:format) {:controller=>"main", :action=>"index"}
/:controller(/:action(/:id(.:format)))
/simple_captcha/:action(.:format) {:controller=>"simple_captcha"}
logout /logout(.:format) {:controller=>"users", :action=>"destroy"}
login /login(.:format) {:controller=>"users", :action=>"show"}
adminsearch /adminsearch(.:format) {:controller=>"classifieds", :action=>"adminsearch"}
mainsearch /mainsearch(.:format) {:controller=>"main", :action=>"mainsearch"}
/:permalink_1/categorysearch(.:format) {:controller=>"main", :action=>"categorysearch"}
contactadvertiser /contactadvertiser(.:format) {:controller=>"main", :action=>"contactadvertiser"}
/:permalink_1(.:format) {:controller=>"main", :action=>"city"}
edit /edit(.:format) {:controller=>"cities", :action=>"edit"}
/activate/:activation_code(.:format) {:controller=>"main", :action=>"activate"}
/edit/:activation_code(.:format) {:controller=>"classifieds", :action=>"edit"}
/update/:activation_code(.:format) {:controller=>"classifieds", :action=>"update"}
/delete/:activation_code(.:format) {:controller=>"classifieds", :action=>"destroy"} classifieds_multidelete /classifieds/multidelete(.:format) {:controller=>"classifieds", :action=>"delete_multiple"}
/:permalink_1/:permalink_2(.:format) {:controller=>"main", :action=>"category"}
/:permalink_1/:permalink_2/:permalink_3(.:format) {:controller=>"classifieds", :action=>"show"}
simple_captcha /simple_captcha/:id(.:format) {:controller=>"simple_captcha", :action=>"show"}
You want to do:
<%= link_to "Edit", edit_classified_path(:activation_code => classified)%>
or edit your routes.rb to:
match '/edit/:id', :controller => 'classifieds', :action => 'edit'
Your routes are very redundant and contradictory. First, try getting rid of the catch-all route:
match ':controller(/:action(/:id(.:format)))'
as it should not be used if you're using RESTful routes. If that doesn't help, let me know and I'll update my answer accordingly.
Further, all of your match routes are incorrect. They should follow the pattern:
match '/my_controller/:id' => 'my_controller#action'

Named route from resources takes me to show page instead of delete page

I am using resources :users in routes.rb. This provides the following paths as rake routes unveils.
users GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
Further, I comment out the legacy wild controller route.
#match ':controller(/:action(/:id(.:format)))'
To add a delete link on my users page I add the following.
<%= link_to "Delete user", user, :method => :delete, :confirm => "Are you sure?" %>
This generated the following html code.
Delete user
I click the link and it takes me to the show page?! What's wrong?
You need to include the default Javascript files for that to work properly:
<%= javascript_include_tag :defaults %>

devise 2 models 2 views problem with path

context:
rails 3.0.3
devise 1.1.5 and 1.2rc
i have following devise rdoc
rails g devise:install
rails g devise user
rails g devise employee
rails g devise:views users
rails g devise:views employees
routes.rb
devise_for :users
devise_for :employees, :path => 'admin'
devise.rb
config.scoped_views = true
rake routes gives
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 GET /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"}
user_unlock POST /users/unlock(.:format) {:action=>"create", :controller=>"devise/unlocks"}
new_user_unlock GET /users/unlock/new(.:format) {:action=>"new", :controller=>"devise/unlocks"}
GET /users/unlock(.:format) {:action=>"show", :controller=>"devise/unlocks"}
new_employee_session GET /admin/sign_in(.:format) {:action=>"new", :controller=>"devise/sessions"}
employee_session POST /admin/sign_in(.:format) {:action=>"create", :controller=>"devise/sessions"}
destroy_employee_session GET /admin/sign_out(.:format) {:action=>"destroy", :controller=>"devise/sessions"}
employee_password POST /admin/password(.:format) {:action=>"create", :controller=>"devise/passwords"}
new_employee_password GET /admin/password/new(.:format) {:action=>"new", :controller=>"devise/passwords"}
edit_employee_password GET /admin/password/edit(.:format) {:action=>"edit", :controller=>"devise/passwords"}
PUT /admin/password(.:format) {:action=>"update", :controller=>"devise/passwords"}
a mailer views users or employees are
link_to 'Change my password', edit_user_password_url(#resource, :reset_password_token => #resource.reset_password_token)
link_to 'Change my password', edit_employee_password_url(#resource, :reset_password_token => #resource.reset_password_token)
But if i submit form i have this error (for user or employee)
TypeError in Devise/passwords#create
Showing /app/views/users/mailer/reset_password_instructions.html.erb where line #8 raised:
can't convert String into Hash
8: <%= link_to 'Change my password', edit_employee_password_url(#resource, :reset_password_token => #resource.reset_password_token) %>
if you have an idea ?
Initialy posted Mar 7 2011
The solution are in application_controller.rb.
add
ActionMailer::Base.default_url_options[:host] = "http://domain.com"

what's the path to destroy registration with devise

I'm trying to add a link so the user can destroy his/her own account. I'm using the built-in registration class.
In my view I have <%= link_to 'Destroy', current_user, :confirm => 'Are you sure you want to destroy your account?', :method => :delete %> pointing to localhost:3000/users/4 by example
First of all, is that the correct link to use?
Secondly, how to redirect to root path because presently it looks like it tries to redirect to user with id 4 (and it fails because it is protected).
Rake routes gives DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
Thanks in advance.
Try
<%= link_to 'Destroy', user_registration_path, :confirm => 'Are you sure you want to destroy your account?', :method => :delete %>
It's because of devise treat registration as Singular Resource.
Besides, run rake routes and you can see details about registration routing:
user_registration POST /users(.:format) {:action=>"create", :controller=>"devise/registrations"}
new_user_registration GET /users/sign_up(.:format) {:action=>"new", :controller=>"devise/registrations"}
edit_user_registration GET /users/edit(.:format) {:action=>"edit", :controller=>"devise/registrations"}
user_registration PUT /users(.:format) {:action=>"update", :controller=>"devise/registrations"}
user_registration DELETE /users(.:format) {:action=>"destroy", :controller=>"devise/registrations"}
It means:
user_registration_path is a helper method that returns /users(.format)
Perform DELETE request on /users(.format) will delete the registration