Редактировать информацию о пользователе с помощью Devise и Devise_Invitable

Я борюсь с этой проблемой на прошлой неделе или около того, и я перепробовал все, что мог придумать, поэтому мне нужна ваша помощь ..! Я использую devise и devise invitable

Я создал страницу для редактирования информации о пользователе, такой как имя пользователя, имя, фамилия...

# /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 %>

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

  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'

Когда я пытаюсь обновить форму, у меня возникает следующая ошибка (мой идентификатор пользователя равен 1):

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

Изменить

Итак, я поставил resources :users, only: [:edit, :update] после devise_for :users, как предложил @coletrain, и ошибка исчезла. Но он перенаправляет на мой профиль /users/1, когда я хочу, чтобы меня перенаправили на /settings/info, и, что более важно, он не обновляет мою информацию... Я предполагаю, что метод обновления в users_controller недоступен.


person titibouboul    schedule 01.10.2013    source источник
comment
Попробуйте переместить свой devise_for:users выше resource:users   -  person coletrain    schedule 01.10.2013
comment
Это работает, но не обновляет информацию о пользователе и перенаправляет меня на пользователей/1, когда я хочу, чтобы меня перенаправили в настройки/информацию (redirect_to в users#update не работает)   -  person titibouboul    schedule 01.10.2013
comment
В действии обновления вашего контроллера измените @user = current_user на @user = User.find(current_user.id). После этого напишите оператор if, который в случае успеха перенаправляет на желаемую страницу или в случае неудачи перенаправляет обратно на страницу редактирования. Дайте мне знать, если это работает.   -  person coletrain    schedule 01.10.2013
comment
сделал это, но это не работает - см. редактирование выше   -  person titibouboul    schedule 01.10.2013


Ответы (2)


В route.rb: добавьте put "users/:id" => "users#update" внутри блока devise_scope :user do ... end.

Также: в методе обновления user_controller измените @user.update_attributes(user_params) на @user.update_attributes(params["user"])

person Runbai Ma    schedule 01.10.2013

У меня такая же проблема. Я думаю, что самое простое решение таково: просто используйте то, что устройство дает вам по умолчанию.

Маршруты:

devise_scope :user do

  get "account", to: "devise/registrations#edit"
  patch "account", to: "devise/registrations#update"
  put "account", to: "devise/registrations#update"
  delete "account", to: "devise/registrations#destroy"

end

/views/devise/registrations/edit.html.erb #generated by devise замените путь следующим образом:

<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>

к этому (потому что в этом примере я назвал маршруты «учетной записью»)

<%= form_for(resource, as: resource_name, url: account_path, html: { method: :put }) do |f| %>

Обратите внимание, что вам также необходимо удалить имя_ресурса. В противном случае после внесения изменений возникнут проблемы с маршрутизацией.

person mklb    schedule 26.05.2014