Search code examples
ruby-on-railsdeviseform-fordevise-invitable

Edit User Info Using Devise and Devise_Invitable


I'm struggling with this issue for the past week or so, and I've tried everything I could think of so I need your help..! I'm using devise and devise invitable

I've created a page to edit user info like username, firstname, lastname...

# /controllers/settings_controllers.rb 
class SettingsController < ApplicationController   
  def info
    @user = current_user   
  end 
end

# /controllers/users_controllers.rb 
class UsersController < Devise::SessionsController   
  def update
    @user = User.find(current_user.id)
    if @user.update_attributes(user_params)
      redirect_to :back
    end
  end
end

# /views/settings/info.html.erb 
<%= form_for(@user) do |f| %> 
<%= render 'shared/error_messages' %> 
<%= f.label :username %> 
<%= f.text_field :username %> 
<%= f.label :firstname %> 
<%= f.text_field :firstname %> 
.... 
<% button_value = "Update" %> 
<% end %>

My routes :

  devise_for :users ,:controllers => { :invitations => 'users/invitations' }
  resources :users, only: [:edit, :update]
  devise_for :users, :skip => [:registrations]                                          
    as :user do
      get 'user/edit' => 'devise/registrations#edit', :as => 'edit_user_registration'    
      put 'user' => 'devise/registrations#update', :as => 'user_registration'            
    end

  devise_scope :user do
    authenticated :user do
      root :to => 'aggregator#index'
    end
    unauthenticated :user do
      root :to => 'devise/sessions#new'
    end

    get "users/new" => "users#new"
    get "users/:id" => "users#show"
  end
  match 'settings/info' => 'settings#info', :as => 'info'

When I try to update the form, I have the following error (my user id is 1) :

Could not find devise mapping for path "/users/1"

Edit

So I've put resources :users, only: [:edit, :update] after devise_for :users, like suggested by @coletrain and error is gone. But it redirects to my profile /users/1 when I want to be redirected to /settings/info and more importantly, it does not update my info... My guess is that update method in users_controller is not reached.


Solution

  • In the routes.rb: add put "users/:id" => "users#update" inside devise_scope :user do ... end block.

    Also: In user_controller update method, change @user.update_attributes(user_params) to @user.update_attributes(params["user"])