7

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

attr_accessible :role_ids, :as => :admin

但这似乎不起作用。

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

我该怎么做呢?

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

4

2 回答 2

9

就像我说的,我们认为将属性限制到某些角色的最好方法是使用 DHH 最近引入的强参数gem。谢天谢地,这也将成为 Rails4 的一部分。

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

如果你有 Railscasts Pro 会员资格,Ryan Bates 已经制作了另一个很棒的教程

简而言之,这就是 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 美元!(我与该网站无关,它只是被证明对我们来说是无价的)

让我知道这是否有帮助。

于 2012-12-16T11:45:16.223 回答
0

在我的用户模型中

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

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

于 2012-12-15T12:03:02.380 回答