1

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

测试失败:':未定义的方法`attr_accessible

我真的不知道为什么,因为 MassAssignmentSecurity 会引入它并且它实际上正在运行。我也尝试过包含所有 ActiveModel ,但这也不起作用。如果我使用包含或扩展来引入 MassAssignmentSecurity,这似乎并不重要。

如果我在测试中传入一些属性以在初始化中执行“assign_attributes”,那也会失败。我对 Rails 很陌生,所以我希望我只是错过了一些非常简单的东西。

TIA。

使用导轨 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
4

1 回答 1

2

哎呀!我昨天真是一团糟。既然我弄清楚了我的问题,不妨回答我自己的问题。

  1. MassAssignmentSecurity 中的 attr_accessible 不像 ActiveRecord 那样工作。它不会创建 getter 和 setter。如果您创建了这些,您仍然必须使用 attr_accessor。

  2. assign_attributes 是有人编写的一个方便函数,用于包裹 mass_assignment_sanitizer,而不是 MassAssignment Security 中的内容。下面是一个示例实现:



def assign_attributes(values, options = {})
  sanitize_for_mass_assignment(values, options[:as]).each do |k, v|
    send("#{k}=", v)
  end
end
于 2013-03-14T14:14:28.443 回答