0

레일즈 3 프로젝트의 컨트롤러 코드에서 기능 테스트를 실행할 때 치명적인 오류가 발생했습니다. params 변수는 controller 포함 action 및 ActiveModel 그것에 대해 행복하지 않다 :Rails 3 기능 테스트 : 보호 속성을 지정할 수 없습니다 : 컨트롤러, 동작

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

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' 

응용 프로그램 호출 (오류가 발생한) "새로운"방법, 코드가이다

마지막으로, 내 테스트 케이스 :

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

params 항상 어떤 환경에서, controlleraction이 포함되어 있기 때문에 당신이 만 아니라 개발 또는 생산 테스트 환경에서 config.active_record.mass_assignment_sanitizer = :strict 을 설정 한 것 같은데.

여기서는 모범 사례가 항상 form_for이므로 params[:credential]에 자격 증명이 있거나 실제로 params.slice(:fid, :uid, etc)이됩니다.

+0

감사합니다. params [: credential]을 사용하지 않는 이유는 웹 API 호출 (컨트롤러에 "새로운"메소드가 없음)이며 일부 매개 변수는 쿼리 문자열이므로 "credential [uid]"isn 쿼리 문자열에 비합리적이지는 않지만 처음 생각한 것은 아닙니다. :) – makdad

관련 문제