无法使用ActiveModel :: MassAssignmentSecurity

时间:2013-03-13 19:12:26

标签: ruby ruby-on-rails-3.2 activemodel

我正在尝试在ActiveModel中使用某些功能,但我无法使一切正常运行。我已经包含了我的类文件和我正在运行的测试。

测试失败了: ':undefined方法`attr_accessible

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

如果我在测试中传入一些属性来在初始化中练习“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

1 个答案:

答案 0 :(得分:2)

糟糕!我昨天真是个烂摊子。自从我弄清楚自己的问题以后,不妨回答我自己的问题。

    MassissignSecurity中的
  1. attr_accessible与ActiveRecord不同。它不会创建getter和setter。如果您创建了attr_accessor,仍然必须使用attr_accessor。

  2. assign_attributes是一个connivence函数,有人编写以包裹mass_assignment_sanitizer,而不是MassAssignment Security中的内容。示例实现如下:

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