2015-02-19 2 views
2

У меня есть ресурс Accounts (модель + контроллер). В настоящее время всем действиям AccountsController предшествует authorize_adminbefore_action, который проверяет, является ли пользователь администратором или нет, а если нет - он перенаправляет пользователя на home_path.Как реализовать авторизацию на основе ролей только для определенных атрибутов модели в Rails?

Теперь я хочу, чтобы пользователи могли редактировать некоторые поля своих учетных записей. Я не знаю, как это сделать. У меня есть несколько идей:

  1. В контроллере же счетов создавать собственные edit_personal_account и update_personal_account действия с пользовательским personal_account_params (Rails 4, сильные параметров). В personal_account_params я буду permit только поля, которые пользователь может редактировать.

  2. Создать новый PersonalAccounts контроллер с нормальными успокоительными действиями, но только edit, update и show. Этот контроллер снова взаимодействует с моделью Account.

  3. Используйте драгоценный камень, например cancancan или pundit. Я просмотрел их документацию и вики, но до сих пор я нашел примеры того, как ограничить доступ к целым действиям на основе роли, а не как ограничить доступ к определенным полям.

Итак, мой вопрос: какой из трех способов был бы наиболее подходящим для моего сценария и есть ли другие лучшие способы?

ответ

4

Как насчет чего-то подобного?

# accounts_controller.rb 
before_action :authorize_admin, except: [:edit, :update] 

def update 
    @account.update(account_params) 
end 

private 

def account_params 
    if current_user.admin? 
    params.require(:account).permit(<all params>) 
    else 
    params.require(:account).permit(<subset of params>) 
    end 
end 

Таким образом, вы бы явно объявить в методе account_params, какие параметры обычные пользователи смогут редактировать, которые могут или не могут быть то, что вы хотите.

Вам также необходимо скрыть некоторые поля в вашем edit представлении на основе роли текущего пользователя (т. Е. Если она является администратором, не скрывает ничего и т. Д.), Но это не должно быть очень сложно. Вы даже можете создать создатель настраиваемой формы.

+0

Это выглядит великолепно! Спасибо. –

Смежные вопросы