我正在尝试在我的rails 4应用程序中实现基于角色的访问系统,我希望最终用户(super_admin)能够通过UI编辑角色分配。
我取得了一些成功,但无法感觉必须有更好的方法(因为我是铁杆新手)。这是我的代码:
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
我正在努力解决以下问题:
UPDATE 我已按照评论的建议考虑使用改革宝石。这似乎是一个很好的解决方案。但是,我对此案例的实施存在问题。
让我把它映射出来: 我在数据库中有3个表:
我想构建一个表单,其中Roles模型中的所有值都是复选框。复选框应该指示哪些值被输入到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
我是朝着正确的方向前进的吗?
感谢您的帮助。
答案 0 :(得分:1)
构建表单需要两件事:用户的角色和可能的角色。
如果我没记错,rolify会为您提供模型关联广告,只需让您执行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]]
定义您的改革对象的同步或保存方法,以处理如何处理提交的输入,但是您正在处理它。您可以(应该)进行自定义验证,以验证提交的角色是否是有效角色。