2013-03-13 5 views
1

Я пытаюсь использовать некоторые функции в ActiveModel, но у меня возникают проблемы с тем, чтобы все работало. Я включил мой файл класса и тест, который я запускаю.Невозможно использовать ActiveModel :: MassAssignmentSecurity

Тест терпит неудачу с: «: неопределенный метод` attr_accessible

Я действительно не знаю, почему, так как MassAssignmentSecurity принесет, что и это на самом деле работает. Я также пытался включить все ActiveModel, но это тоже не работает. Кажется, не имеет значения, если я использую include или расширяю, чтобы вызвать MassAssignmentSecurity.

Если я передаю некоторые атрибуты в своем тесте, чтобы реализовать «assign_attributes» в инициализации, это тоже не сработает. Я довольно новичок в рельсах, поэтому я надеюсь, что я просто пропустил что-то очень простое.

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 

ответ

2

Yikes! Какой беспорядок я был вчера. Мог бы ответить на мой собственный вопрос, так как я выяснил свои проблемы.

  1. attr_accessible in MassAssignmentSecurity не работает, как с ActiveRecord. Он не создает геттеры и сеттеры. Вам все равно придется использовать 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 
Смежные вопросы