在我的User
模型中,我有这个:
attr_accessible :role_ids, :as => :admin
但这似乎不起作用。
我希望只有在以下情况下才能访问此特定属性current_user.can?(:edit, Role)
- 即只有具有角色admin
或superadmin
应该能够访问这些属性的用户。
我该怎么做呢?
编辑 1:我正在使用 Devise、CanCan 和 Rolify。
在我的User
模型中,我有这个:
attr_accessible :role_ids, :as => :admin
但这似乎不起作用。
我希望只有在以下情况下才能访问此特定属性current_user.can?(:edit, Role)
- 即只有具有角色admin
或superadmin
应该能够访问这些属性的用户。
我该怎么做呢?
编辑 1:我正在使用 Devise、CanCan 和 Rolify。
就像我说的,我们认为将属性限制到某些角色的最好方法是使用 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 美元!(我与该网站无关,它只是被证明对我们来说是无价的)
让我知道这是否有帮助。
在我的用户模型中
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
并且可能有更聪明的方法来做到这一点......