我正在尝试在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
答案 0 :(得分:2)
糟糕!我昨天真是个烂摊子。自从我弄清楚自己的问题以后,不妨回答我自己的问题。
attr_accessible与ActiveRecord不同。它不会创建getter和setter。如果您创建了attr_accessor,仍然必须使用attr_accessor。
assign_attributes是一个connivence函数,有人编写以包裹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