2012-08-31 3 views
6

현재 차량을 만드는 양식이 있습니다. 당신은 더 make_id 또는 model_id 열이 없는지주의 할 것이다양식을 제출할 때 입력란을 무시하십시오.

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
end 

;처럼 차량 모델은 처음 본다 이는 트림이 모델에 속하고 모델이 제조사에 속하기 때문에 필요하지 않으며 차량 모델에 저장할 필요가 없습니다.

차량 형태에 문제가 생겼습니다. 링크 된 선택 항목이 있습니다. 여기에서 선택하고 모델을 선택한 다음 모델을 선택할 수 있습니다. 당신이주의 바와 같이, 제조업체와 모델 선택 양식 매개 변수가없는

<%= select("", "", Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select("", "", options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

, 따라서 무시됩니다 : 나는 새로운 차량을 만드는 오전하는 경우, 다음 코드는 잘 작동합니다. 이것은 잘 작동하고 차량은 올바르게 저장됩니다.

이 차량을 수정할 때 어려움이 발생합니다. make와 model dummy가 트림에 체인을 선택하기 때문에 처음에는 편집중인 차량의 모델과 모델이 아닌 기본값으로 설정됩니다. 예상되는으로 제조업체와 모델이 아니기 때문에,이 Can't mass-assign protected attributes: make, model 결과,

<%= f.select(:make, Make.all.collect {|p| [ p.value, p.id ] }, {:prompt => 'Select Make'}, {} %> 
<%= f.select(:model, options_for_select([]), {:prompt => 'Select Model'}, {} %> 
<%= f.select(:trim_id, options_for_select([]), {:prompt => 'Select Trim'} %> 

:하지만, 그 결과 나는 같이 내 모델을 업데이트 한 :

class Vehicle < ActiveRecord::Base 
    attr_accessible :trim_id 

    belongs_to :trim 
    has_one :model, :through => :trim 
    has_one :make, :through => :model 
end 

을 그리고 폼 업데이트 attr_accessible (그리고 어쨌든 make와 model 컬럼은 존재하지 않는다).

내 질문은 : 새로운 차량 폼을 제출할 때이 필드를 무시할 수있는 방법이 있지만 차량을 수정할 때 올바른 값을 선택하게하는 방법이 있습니까?

감사합니다.

def create 
    @sale = Sale.new 
    current_ability.attributes_for(:new, Sale).each do |key, value| 
     @sale.send("#{key}=", value) 
    end 
    @sale.update_attributes(params[:sale].except("date")) 
    authorize! :create, @sale 
    if @sale.save 
     redirect_to @sale, :notice => "Successfully created sale." 
    else 
     render :action => 'new' 
    end 
end 

당신은 내가 여기에 "날짜"를 제외시켰다 위해 노력하고 있습니다 것 (도 시도 : 날짜)

편집은 다음과 같이 Beerlington의 대답은 당, 내 create 조치를 업데이트 한 -이 중첩되지 않은 속성으로 테스트하는 것이 었습니다.

그러나 아직 날짜가 제출 중임을 알고 있습니다. 해시를 제외한 모든 컨트롤러 작업을 지원할 수 있습니까?

편집 2 : 원래 질문에 대답으로 나는 올바른로 Beerlington의 답변을 표시 한 - 여기 후속 질문 물었다 : Excluding nested form fields in controller action with Hash#exclude before mass_assignment error is generated?

답변

12

당신은 Hash#except를 사용하여 필요하지 않은 키를 제거 할 수 있습니다 :

@vehicle.update_attributes(params[:vehicle].except(:make, :model)) 
+0

감사합니다. 작동하는 것처럼 보이네요. vehicles_attributes"=>{"0"=>{"make"=>""}에 만드시겠습니까? 감사! –

+0

원래 질문에 대한 대답으로 올바른 경로에 표시되므로 답변으로 표시됩니다. –

관련 문제