【问题标题】:Rolify and Rails 4 role managementRolify 和 Rails 4 角色管理
【发布时间】:2014-12-29 15:25:56
【问题描述】:

我正在尝试在我的 rails 4 应用程序中实现基于角色的访问系统,并且我希望最终用户 (super_admin) 能够通过 UI 编辑角色分配。

我已经取得了一些成功,但不禁觉得必须有更好的方法(因为我是 Rails 新手)。这是我的代码:

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. 如何创建类似的内容,但当前角色已被选中? (真正的角色管理)

更新 我已经研究过使用 cmets 建议的改革 Gem。这似乎是一个很好的解决方案。然而,我对这个案例的实施有疑问。

让我把它画出来: 我在数据库中有 3 个表:

  1. 用户
  2. users_roles(具有 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.查看reform 了解无表模型。
  • 谢谢@JustinM。我在我的帖子中添加了更新。看起来你肯定在做某事。

标签: ruby-on-rails-4 devise rolify pundit reform


【解决方案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]]

定义您的改革对象的同步或保存方法来处理如何处理提交的输入,但是您正在处理它。您可以(应该)进行自定义验证,以验证提交的角色是否为有效角色。

【讨论】:

    猜你喜欢
    • 2016-03-18
    • 1970-01-01
    • 2012-08-09
    • 2016-06-02
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    相关资源
    最近更新 更多