#ruby-on-rails #ruby-on-rails-3 #devise
#ruby-on-rails #ruby-on-rails-3 #разработка
Вопрос:
Я впервые пробую Devise. Одна из вещей, которую я хотел сделать, это предоставить пользователям-администраторам интерфейс для создания, поиска и редактирования пользователей. Возможно, здесь я ошибся.
Я создал класс PeopleController, который наследуется от ApplicationController, который перечисляет пользователей и предоставляет методы и представления для создания и обновления пользователей. Все работает нормально, за одним исключением. Когда пользователь-администратор обновляет свою собственную запись, сеанс очищается, и ему приходится входить в систему снова после ее сохранения.
В этом приложении я не использую регистрируемый модуль. Только пользователь-администратор может создавать новых пользователей. Как правильно в devise предоставлять инструменты управления пользователями. Создание моего собственного контроллера, похоже, было неправильным путем.
Заранее спасибо за вашу помощь.
Ответ №1:
Большое вам спасибо за помощь. По сути, это именно то, что я делаю. Я обнаружил подсказку, которая помогла мне решить проблему очистки сеанса пользователя при редактировании им собственной записи в этой вики:
Это строка, которая мне была нужна:
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