2013-03-13 88 views
1

我试图使用一些加载ActiveModel功能,但我无法使一切工作。我已经包含了我的课程文件和我正在运行的测试。 “:无法加载ActiveModel使用:: MassAssignmentSecurity

试验与失败未定义的方法`attr_accessible

我真的不知道为什么,因为MassAssignmentSecurity将带来的,它实际上是在运行。我也试图包括所有的ActiveModel,但这也不起作用。如果我使用include或extend来引入MassAssignmentSecurity,似乎并不重要。

如果我通过在我测试的一些属性在initialize行使“assign_attributes”,失败也是如此。我对rails很新,所以我希望我只是错过了一些非常简单的东西。

TIA。

使用Rails 3.2.12


my_class.rb

class MyClass 
    include ActiveModel::MassAssignmentSecurity 
    include ActiveModel::Validations 
    include ActiveModel::Conversion 
    extend ActiveModel::Naming 
    extend ActiveSupport::Callbacks 

    attr_accessible :persisted, :creds 

    def initialize(attributes = nil, options = {}) 
    @persisted = false 

    assign_attributes(attributes, options) if attributes 

    yield self if block_given? 
    end 
end 

my_class_spec.rb

require 'spec_helper' 

describe MyClass do 
    before do 
    @testcase = MyClass.new 
    end 
    subject { @testcase } 

    it_should_behave_like "ActiveModel" 

    it { MyClass.should include(ActiveModel::MassAssignmentSecurity) } 

    it { should respond_to(:persisted) } 
end 

支持/ active_model.rb

shared_examples_for "ActiveModel" do 
    include ActiveModel::Lint::Tests 

    # to_s is to support ruby-1.9 
    ActiveModel::Lint::Tests.public_instance_methods.map{|m| m.to_s}.grep(/^test/).each do |m| 
    example m.gsub('_',' ') do 
     send m 
    end 
    end 

    def model 
    subject 
    end 
end 

回答

2

哎呀!我昨天真是一团糟。自从我解决了我的问题之后,不妨回答我自己的问题。

  1. attr_accessible in MassAssignmentSecurity不像ActiveRecord那样工作。它不会创建获取者和设置者。如果您创建了这些,您仍然必须使用attr_accessor。

  2. assign_attributes是某人编写的用于环绕mass_assignment_sanitizer的连接函数,并且在MassAssignment安全性中未包含某些内容。示例实施如下:



def assign_attributes(values, options = {}) 
    sanitize_for_mass_assignment(values, options[:as]).each do |k, v| 
    send("#{k}=", v) 
    end 
end 
相关问题