При выполнении функциональных тестов кода моего контроллера в проекте 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 пытается быть «приятным» и снабжать меня дополнительными значениями для тестирования, но, похоже, это вызывает проблемы.
Любые рекомендации относительно того, как решить эту проблему?
Спасибо. Причина, по которой я не использую params [: credential], заключается в том, что это вызов Web API (в моем контроллере нет «нового» метода), а некоторые из них - строка запроса, поэтому «credential [uid]» isn 't необоснованно в строке запроса ... но не первое, что я думал сделать :) – makdad