Ruby on rails rails中可访问的动态属性

Ruby on rails rails中可访问的动态属性,ruby-on-rails,ruby-on-rails-3,railscasts,Ruby On Rails,Ruby On Rails 3,Railscasts,根据设计,动态属性很容易实现。尽管我在尝试在rails控制台中创建对象时遇到了一些错误。请告知 我得到的错误如下: ruby-1.9.3-p0:005>User.new:username=>“johnsmith”,“email=>”johnsmith@gmail.com,:password=>“更改此” ArgumentError:参数数目错误(1代表0) from/Volumes/Terra Nova/jwaldrip/Sites/theirksome/config/initializers/

根据设计,动态属性很容易实现。尽管我在尝试在rails控制台中创建对象时遇到了一些错误。请告知

我得到的错误如下:

ruby-1.9.3-p0:005>User.new:username=>“johnsmith”,“email=>”johnsmith@gmail.com,:password=>“更改此”
ArgumentError:参数数目错误(1代表0)
from/Volumes/Terra Nova/jwaldrip/Sites/theirksome/config/initializers/accessible_attributes.rb:6:in'mass_assignment_authorizer'
from/Volumes/Terra Nova/jwaldrip/.rvm/gems/ruby-1.9.3-p0/gems/activemodel-3.1.3/lib/active\u model/mass\u assignment\u security.rb:209:in `为mass\u assignment进行消毒'
from/Volumes/Terra Nova/jwaldrip/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.1.3/lib/active\u record/base.rb:1744:在“分配属性”中
from/Volumes/Terra Nova/jwaldrip/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.1.3/lib/active_record/base.rb:1567:在“初始化”中
发件人(irb):5:在“new”中
来自(irb):5
from/Volumes/Terra Nova/jwaldrip/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/console.rb:45:in'start'
from/Volumes/Terra Nova/jwaldrip/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands/console.rb:8:in'start'
from/Volumes/Terra Nova/jwaldrip/.rvm/gems/ruby-1.9.3-p0/gems/railties-3.1.3/lib/rails/commands.rb:40:in`'
来自脚本/rails:6:in'require'
来自脚本/rails:6:in`'
/models/user.rb:

class用户
/config/initializers/accessible_attributes.rb:

class ActiveRecord::Base
可访问属性
属性访问器:可访问
私有的
def质量分配授权人
如果可访问==:全部
self.class.protected\u属性
其他的
超级+(可访问| |[])
结束
结束
结束

不完全确定您到底想做什么,也不完全确定此大规模任务授权人的目的是什么。似乎有更简单的方法来防止大规模分配。也就是说,我读了最后一篇,它看起来好像一旦你有了这个初始值设定项,你就不能在创建对象时将任何参数传递给初始值设定项。即使可以,它也不会设置属性

在控制器中,我们还需要将可访问选项应用于创建操作。如果我们只是这样应用它,那么它将不起作用

这不起作用的原因是,质量分配发生在新调用中,所以当我们设置为可访问时,为时已晚。我们需要将创建一篇新文章与分配它的属性分开,并在两者之间滑动对accessible的调用

因此,在我看来,要为您的一个模型设置属性,现在您需要首先创建它,然后将类上的“可访问”设置为
:all
,然后手动分配所需的属性,如:

u = User.create
u.accessible = :all if current_user.is_admin? # or whatever the conditional is for the admin user
u.update_attributes(:username => "johnsmith", :email => "johnsmith@gmail.com", :password => "changethis")

根据需要基于权限访问的属性数量,您最好跳过此模块,因为实现此模块需要一点额外的工作。如果只有一个或两个模型上的几个属性,那么最好使用自己的方法和attr_访问手动实现此功能。尝试阅读,看看您是否可以在没有此插件的情况下获得所需的结果?

我尝试完成的唯一一件事是根据您的权限使某些属性可访问。A.k.A.当您拥有该对象,或者您是管理员时。在观看railscast并重新阅读描述后,我改变了对它的看法。我认为这是个聪明的办法。尽管如此,railscast似乎已经过时,并且与rails 3.1不兼容。看起来它变得更容易了,而且您使用的模块没有必要了,因为您现在可以定义每个角色可以访问哪些属性。
u = User.create
u.accessible = :all if current_user.is_admin? # or whatever the conditional is for the admin user
u.update_attributes(:username => "johnsmith", :email => "johnsmith@gmail.com", :password => "changethis")