【问题标题】:How do I make some attributes accessible only to Users that have a specific role?如何使某些属性只能由具有特定角色的用户访问?
【发布时间】:2012-12-15 03:48:47
【问题描述】:

在我的User 模型中,我有这个:

attr_accessible :role_ids, :as => :admin

但这似乎不起作用。

我希望只有在 current_user.can?(:edit, Role) 时才能访问此特定属性 - 即只有具有 adminsuperadmin 角色的用户才能访问这些属性。

我该怎么做?

编辑 1:我正在使用 Devise、CanCan 和 Rolify。

【问题讨论】:

  • 反对票和接近票是怎么回事?愿意提供解释吗?
  • 你安装了什么?您在使用 Cancan 并进行设计吗?否决票可能是缺乏信息。
  • @simonmorley 是的,CanCan & Devise。抱歉,将更新问题。
  • 嘿。大概您已经对自己的能力进行了分类并且可以正常工作?在 rails3 中,您不能限制角色可以访问 attr。我心中的一个大问题。然而,在 R4 中引入了一个称为强参数的 gem。我会在一分钟内添加一个答案,因为我认为这会对你有所帮助。
  • @simonmorley 是的,我已经完成了这些。你的答案正是我想要的。谢谢!

标签: ruby-on-rails ruby-on-rails-3


【解决方案1】:

就像我说的,我们认为将属性限制为某些角色的最佳方法是使用 DHH 最近推出的strong parameters gem。谢天谢地,这也将成为 Rails4 的一部分。

即使它不适合,开始整合这些原则也是一个好主意,因为这将使您的 Rails 3 到 4 升级更容易。

如果您拥有 Railscasts Pro 会员资格,Ryan Bates 已经在上面创建了另一个 fantastic tutorial

简而言之,这是 Railscast 中推荐的内容。

安装 gem 后,从模型中删除 attr_accessible。

将此添加到初始化程序:

ActiveRecord::Base.send(:include,  ActiveModel::ForbiddenAttributesProtection)

更改控制器中的更新操作::

def update
  @topic = Topic.find(params[:id])
  if @topic.update_attributes(topic_params)
    redirect_to topics_url, notice: "Updated topic."
  else
    render :edit
  end
end 

在控制器中创建私有方法:

 def topic_params
   if current_user && current_user.admin?
     params[:topic].permit(:name, :sticky)
    else
      params[:topic].permit(:name)
    end
  end

在您的情况下,就像我们一样,您必须更改 topic_params 方法才能使用您的角色。

RailsCast 中还有一些建议,真的值 9 美元! (我与该网站没有任何关联,它只是被证明对我们非常宝贵)

如果这有帮助,请告诉我。

【讨论】:

  • 非常感谢您。这看起来像我需要的。实际上,我一直在坚持获得 RailsCast 的专业版 - 但我最近确实购买了订阅,事实证明它非常有用。只是对strong_parameters gem 和这个 RailsCast 做一个快速的概述,看起来它就是我需要的。
  • 最初的工作量可能超出您的预期,但从长远来看非常值得。祝你好运。 S
  • 是的,我就是这么想的……哎呀……这看起来很头疼。但是,我别无选择 - RailsCast 的可用性使其更易于管理。
  • 出于好奇,您有使用购物车的经验吗? - stackoverflow.com/questions/13899686/… 我正在尝试实施常规的购物车解决方案,但不想使用 spree。不幸的是,瑞恩最近没有做过关于这个话题的演员表:(
  • 您能否澄清一下“包含在初始化程序中”的意思?那是什么文件?
【解决方案2】:

在我的用户模型中

class User
  attr_accessible :nickname, as: :admin
end

在我的 Rails 控制台中

User.first.update_attributes!({nickname: "uschi"})
# WARNING: Can't mass-assign protected attributes: nickname

User.first.update_attributes!({nickname: "uschi"}, {as: :admin})
# true

更新

也许我很愚蠢地解决了你的问题,但只是做一个

if current_user.can?(:edit, Role)
  user.update_attributes!({nickname: "uschi"}, {as: :admin})
else
  first.update_attributes!({nickname: "uschi"})
end

而且可能有更聪明的方法来做到这一点......

【讨论】:

  • 我需要它来处理我的Ability 模型中指定的角色 - 用于 CanCan 和 Rolify。 :as => :admin 不会。
  • 是的,Cancan 不正确,因为它看起来像是在为管理员创建一个布尔值。
  • 是的...@simonmorley 很到位。我正在尝试使用 CanCan 和 Rolify 限制对模型上某些属性的访问。您建议的是您将在控制器或视图或其他东西上执行的操作。我需要在我的模型中这样做。
猜你喜欢
  • 2022-11-26
  • 1970-01-01
  • 2014-05-16
  • 2020-01-31
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多