0

При выполнении функциональных тестов кода моего контроллера в проекте Rails 3 у меня есть фатальная ошибка; переменная params содержит controller и action и ActiveModel не устраивает по этому поводу:Функциональные тесты Rails 3: невозможно назначить защищенные атрибуты: контроллер, действие

вызова
ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: controller, action 
    /Users/phooze/.rvm/gems/ruby-1.9.3-p0/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security/sanitizer.rb:48:in `process_removed_attributes' 
    /Users/phooze/.rvm/gems/ruby-1.9.3-p0/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security/sanitizer.rb:20:in `debug_protected_attribute_removal' 
    /Users/phooze/.rvm/gems/ruby-1.9.3-p0/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security/sanitizer.rb:12:in `sanitize' 
    /Users/phooze/.rvm/gems/ruby-1.9.3-p0/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security.rb:228:in `sanitize_for_mass_assignment' 
    /Users/phooze/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.2.1/lib/active_record/attribute_assignment.rb:75:in `assign_attributes' 
    /Users/phooze/.rvm/gems/ruby-1.9.3-p0/gems/activerecord-3.2.1/lib/active_record/base.rb:495:in `initialize' 
    /Users/phooze/Documents/rails-app/app/controllers/credentials_controller.rb:40:in `new' 

Приложения к «новому» методу (где происходящая ошибка), код:

# Credential#create (POST) 
    def create 
     @credential = Credential.new(params) 
     # ... controller continues 
    end 

Наконец, мой тест:

test "should create credential" do 
    assert_difference('Credential.count', 1) do 
     post :create, { :fid => "foobarbaz", :credentials_hash => "f00ba7f00ba7", :uid => "10023", :cid => "342" } 
    end 
    assert_response :created 
    end 

Изменение моего кода контроллера в «отдельный» параметр хэш, содержащий только FID, удостоверение s_hash, uid и cid заставляют его работать. Я уверен, что Rails пытается быть «приятным» и снабжать меня дополнительными значениями для тестирования, но, похоже, это вызывает проблемы.

Любые рекомендации относительно того, как решить эту проблему?

ответ

2

Похоже, вы установили config.active_record.mass_assignment_sanitizer = :strict в тестовой среде только, но не в разработке или производстве, потому что params всегда содержит controller и action, в любой среде.

Я считаю, что рекомендация по оптимальной практике заключается в том, чтобы всегда использовать form_for, чтобы вы имели свои учетные данные в params[:credential] или, действительно, сделали params.slice(:fid, :uid, etc).

+0

Спасибо. Причина, по которой я не использую params [: credential], заключается в том, что это вызов Web API (в моем контроллере нет «нового» метода), а некоторые из них - строка запроса, поэтому «credential [uid]» isn 't необоснованно в строке запроса ... но не первое, что я думал сделать :) – makdad

Смежные вопросы