2014-12-29 2 views
0

Я пытаюсь реализовать систему доступа на основе ролей в своем приложении rails 4, и я хочу, чтобы конечный пользователь (super_admin) имел возможность редактировать назначения роли через пользовательский интерфейс.Управление ролью Rolify and Rails 4

Я достиг некоторого успеха, но не могу не чувствовать, что должен быть лучший способ (поскольку я новичок в рельсах). Вот мой код:

users_roles_controller.rb 

# GET /user_roles/new/:id 
def new 
    @roles = Role.all 
end 

# POST /user_roles/new/:id 
def create 
    populated = params[:roles][:name].reject(&:empty?) 
    populated.each do |key| 
    @user.add_role Role.find(key).name 
    end 

    redirect_to users_path 
end 

И в моей форме (HAML и simple_form):

= simple_form_for :roles, :url => create_user_roles_path(@user.id), :method => "post" do |f| 

= f.input :name, :collection => @roles, as: :check_boxes 

= f.button :submit 

я борюсь со следующим:

  1. Как проверить формы записи, так как нет модели?
  2. Должен ли я использовать сильные параметры, и если да, то каким образом я могу реализовать на форме без модели
  3. Как создать что-то подобное, но с текущими ролями уже проверены? (Истинное управление ролями)

ОБНОВЛЕНИЕ Я рассмотрел использование реформа Gem, как это было предложено в комментариях. Это кажется отличным решением. Однако у меня возникают проблемы с реализацией этого дела.

Позволь мне карту это: У меня есть 3 таблицы в базе данных:

  1. пользователи
  2. users_roles (Mapping таблица с 2 Атрибутами: user_id & role_id {Join Table -> HABTM})
  3. Роли

Я хочу создать форму со всеми значениями в модели Роли в качестве флажков. Флажки должны диктовать, какие значения подаются в таблица users_roles (по отношению к определенному пользователю). То, что я хочу сделать, - это подтвердить ввод этой формы. Эта форма всегда отображает все значения в Ролях, но некоторые/все поля могут быть сняты.

Я создал папку формы в моем приложении и начал со следующим кодом:

class UserRoleForm < Reform::Form 

property :user__id, on: :user 
property :role_id, on: :role 

validates :user__id, presence: true 
validates :role__id, presence: true 
end 

я иду в правильном направлении?

Спасибо за помощь.

+1

1. Проверьте [реформа] (https://github.com/apotonick/reform) для моделей без таблиц. –

+0

Спасибо @ JustinM. Я добавил обновление к своему сообщению. Это, безусловно, похоже на то, что вы на что-то. – Herm

ответ

1

Вам нужно две вещи для создания вашей формы: роли пользователя и возможные роли.

Если я правильно напомню, что объявление в рекламных объявлениях моделей должно просто дать вам сделать что-то вроде some_user.roles, чтобы вернуть все роли, примененные к some_user.

Чтобы получить возможные роли, воспользуйтесь Role.all.

объединить оба, попробуйте

user_roles = some_user.roles.pluck(:name) # suppose this returns ["admin"] 
Role.pluck(:name).map { |r| [r, user_roles.include?(r)] } 

Теперь у вас есть массив, как это, что вы можете использовать, чтобы построить свои формы флажков с каждой петлей.

[["customer", false], ["admin", true], ["editor", false]] 

Определение синхронизации вашего объекта РЕФОРМЫ или сохранить метод для обработки, что делать с представленным входом, однако вы с ней. Вы можете (СЛЕДУЕТ) сделать специальную проверку, чтобы проверить, являются ли представленные роли действительными ролями.

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