Ruby on rails 如何使某些属性仅可供具有特定角色的用户访问?

Ruby on rails 如何使某些属性仅可供具有特定角色的用户访问?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,在我的用户模型中,我有: attr_accessible :role_ids, :as => :admin 但这似乎不起作用 我希望只有当当前用户可以(:编辑,角色)时才能访问此特定属性,即只有角色为admin或superadmin的用户才能访问这些属性 我该怎么做 编辑1:我正在我的用户模型中使用Desive、CanCan和Rolify. class User attr_accessible :nickname, as: :admin end 在我的rails控制台中 User.

在我的
用户
模型中,我有:

attr_accessible :role_ids, :as => :admin
但这似乎不起作用

我希望只有当
当前用户可以(:编辑,角色)
时才能访问此特定属性,即只有角色为
admin
superadmin
的用户才能访问这些属性

我该怎么做

编辑1:我正在我的用户模型中使用Desive、CanCan和Rolify.

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

也许有更聪明的方法可以做到这一点…

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

即使它不适合,也最好开始集成这些原则,因为这将使Rails 3到4的升级更容易

如果你有Railscasts专业会员资格,Ryan Bates已经在这上面做了另一个

简言之,以下是该铁路公司的建议

安装gem后,从模型中删除可访问的属性

将其添加到初始值设定项:

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
在控制器中更改更新操作::

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
在控制器中创建私有方法:

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美元!(我与该网站没有任何关联,它对我们来说是无价的)


让我知道这是否有帮助。

否决票和接近票是怎么回事?想解释一下吗?你安装了什么?你在使用Cancan和Desive吗?否决票可能是缺乏信息。@simonmorley是的,CanCan&Deave。对不起,将更新问题。嘿。大概你已经整理好了你的能力,让坎坎在一般情况下工作?在rails3中,不能限制角色可以访问attr。我脑子里有个大问题。然而,R4中引入了一个称为强参数的gem。我会在一分钟内添加一个答案,因为我认为这会对您有所帮助。@simonmorley是的,我已经完成了。你的答案正是我想要的。谢谢我需要它来处理我的
能力
模型中指定的角色-用于CanCan&Rolify。对于
:as=>:admin
它不是。是的,这对Cancan不正确,因为它看起来像是在为admin创建布尔值。是的@西蒙莫利是正确的。我试图使用CanCan&Rolify限制对模型上某些属性的访问。您所建议的是您将在控制器或视图中执行的操作。我需要用我的模型来做。非常感谢。这看起来是我需要的。事实上,我一直在坚持购买RailsCast的专业版,但我最近确实购买了一份订阅,事实证明它非常有用。只需快速概述一下
strong\u参数
gem,这个RailsCast看起来正是我需要的。这项工作最初比你可能希望的要多,但从长远来看是值得的。祝你好运赛斯,这就是我想的…哦,维耶…这看起来很头痛。但是,我别无选择,而且有了铁路司机,管理起来就容易多了。出于好奇,你有购物车的经验吗我正在尝试实现一个常规的购物车解决方案,但不想使用spree。不幸的是,Ryan最近没有做过关于这个话题的广播:(你能澄清一下“包含在你的初始值中”是什么意思吗?那是什么文件?