Администрирование пользователя администратором с помощью Devise

#ruby-on-rails #ruby-on-rails-3 #devise

#ruby-on-rails #ruby-on-rails-3 #разработка

Вопрос:

Я впервые пробую Devise. Одна из вещей, которую я хотел сделать, это предоставить пользователям-администраторам интерфейс для создания, поиска и редактирования пользователей. Возможно, здесь я ошибся.

Я создал класс PeopleController, который наследуется от ApplicationController, который перечисляет пользователей и предоставляет методы и представления для создания и обновления пользователей. Все работает нормально, за одним исключением. Когда пользователь-администратор обновляет свою собственную запись, сеанс очищается, и ему приходится входить в систему снова после ее сохранения.

В этом приложении я не использую регистрируемый модуль. Только пользователь-администратор может создавать новых пользователей. Как правильно в devise предоставлять инструменты управления пользователями. Создание моего собственного контроллера, похоже, было неправильным путем.

Заранее спасибо за вашу помощь.

Ответ №1:

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

https://github.com/plataformatec/devise/wiki/How-To:-Allow-users-to-edit-their-account-without-providing-a-password

Это строка, которая мне была нужна:

 sign_in resource_name, resource, :bypass => true
  

Этот метод находится в Devise:: Controllers::Helpers, поэтому я сделал это в своем контроллере.

 class PeopleController < ApplicationController
   include Devise::Controllers::Helpers
  

Затем в моем методе обновления я вызываю его, только если current_user.id равно идентификатору, который редактируется:

 def update
  @person = User.find(params[:id])
  if @person.update_attributes(params[:user])
    sign_in @person, :bypass => true if current_user.id == @person.id
    redirect_to  person_path(@person), :notice  => "Successfully updated user."
  else
    render :action => 'edit'
  end
end
  

Теперь, если текущий пользователь редактирует свою собственную запись, сеанс восстанавливается после его сохранения.

Еще раз спасибо за ваши ответы.

Ответ №2:

Именно так я управляю пользователями в одном из своих приложений. У меня есть только один User класс, созданный с помощью

 rails g devise User
  

к которому я добавил role столбец с этой миграцией:

 class AddRoleToUser < ActiveRecord::Migration
  def change
    add_column :users, :role, :string, :default => "client"
  end
end
  

и моя User модель:

 class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :recoverable, :rememberable, :trackable, :validatable

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me

  def admin?
    self.role == "admin"
  end
end
  

Затем для создания новых пользователей все, что вам нужно будет сделать, это предоставить пользовательский метод в контроллере (возможно, даже подклассе Devise::RegistrationsController ), подобный этому:

 # some_controller.rb
def custom_create_user
  if current_user.admin?
    User.create(:email => params[:email], password => params[:password])
    redirect_to(some_path, :notice => 'sucessfully updated user.')
  else
    redirect_to(some_other_path, :notice => 'You are not authorized to do this.')
  end
end
  

Комментарии:

1. Я бы также рекомендовал, возможно, использовать отдельную «ролевую» модель, чтобы пользователь мог иметь несколько ролей, если это необходимо. Вероятно, это тоже упростило бы все. Затем модель объединения, возможно, называемая «UserRole», которая будет иметь user_id и role_id роли.

2. Это правда, хотя я обычно использую cancan , когда мне нужно определить несколько ролей или сложные разрешения.

3. Я также использую CanCan, но я все еще использую отдельную модель для подражания. Посмотрите на эту потрясающую вики-страницу, созданную Райаном Бейтсом: github.com/ryanb/cancan/wiki/Separate-Role-Model