0

Rails 4.1을 시작하면서 update_attributes 메소드를 사용하여 모델을 업데이트하려고 할 때 어떤 일이 벌어지고 있는지 이해하는 데 어려움을 겪고 있습니다. 나는 사용자가 맥주를 리뷰 할 수있게하는 작은 앱을 작성했다. 사용자는 다음과 같습니다 양식을 사용하여 리뷰를 편집 할 수 있습니다Rails 모델의 일부 속성이 update_attributes 메소드에 의해 업데이트되지 않음

<%= form_for review do |f| %> 
<%= f.label :rating %> 
<%= f.select :rating, 1..5%> 
<%= f.label :review_text %> 
<%= f.text_area :review_text %> 
<%= hidden_field_tag :beer_id, @beer.id %> 
<%= hidden_field_tag :on_wishlist, "f" %> 
<%= f.submit %> 
<% end %> 

컨트롤러는 다음과 같습니다 간단한 업데이트 작업이 있습니다

@review.update_attributes(review_params) 

그리고 매개 변수는 다음과 같이 :

def review_params 
    params.require(:review).permit(:rating, :user_id, :beer_id, :review_text, :on_wishlist) 
end 

모두 매우 간단합니다. 내가 알 수없는 것은이 속성이 일부 속성 만 업데이트하는 이유입니다. 특히 on_wishlist 속성은 업데이트되지 않습니다. 서버 로그를 보면 다음과 같습니다 :

매개 변수 : {... "review"=> "5", "review_text"=> "What a good beer" } "beer_id"= ""4 ","on_wishlist "=>"F "는 =>"업데이트 리뷰 ","ID "=" "7"}

...

"커밋"

SQL (0.5ms) UPDATE "리뷰"SET "rating"=?, "review_text"=?, "updated_at"=? "리뷰", "id"= 7 [[ "rating", 5], [ "review_text", "좋은 맥주"], [ "updated_at", "2015-01-15 22 : 51 : 56.009256"] ]

review_params 해시에 있어도 업데이트에 포함되지 않은 on_wishlist 숨김 필드가 서버로 전송되는 것을 볼 수 있습니다.

@review.update_attributes(review_params) 
@review.on_wishlist = params[:on_wishlist] 
@review.save 

그러나 on_wishlist 별도로 처리 할 필요가해야하는 이유를 이해가 안 : 나는 다음에 컨트롤러 코드를 변경하는 경우

, 그것은 잘 작동합니다. 다음과 같이 내가 생각할 수있는 유일한 관련 세부 사항, on_wishlist이 리뷰의 나머지 부분과는 별도의 마이그레이션에 추가 된 점이다

class AddOnWishlistToReviews < ActiveRecord::Migration 
    def change 
    add_column :reviews, :on_wishlist, :bool, :default => false 
    end 
end 

내가 뭔가 간단한 누락 확신 - 당신의 도움에 대한 감사 .

답변

0

beer_idon_wishlist을 양식의 별도 입력란으로 정의했기 때문입니다. 객체로 정의한 다른 필드는 f입니다. 당신은 PARAMS에서 볼 수

가 서버로 전송 한 경우에만이 :

"review"=>{"rating"=>"5", "review_text"=>"What a good beer"} 

그래서, 개체 @review 만이 필드를 업데이트 할 수 있습니다. 실제로 review_paramsparams[:review]입니다.

<%= f.hidden_field :beer_id, value: @beer.id %> 
<%= f.hidden_field :on_wishlist, value: "f" %> 

또는 이들의 이름 변경 :

그래서 당신이 beer_idon_wishlist, 당신은 이러한 필드를 만들 수 있습니다 업데이트 할 경우 f 개체를 사용하여 양식 객체에 속하는

<%= hidden_field_tag :beer_id, @beer.id, name: 'review[beer_id]' %> 
<%= hidden_field_tag :on_wishlist, "f", name: 'review[on_wishlist]' %> 
+0

아, 나는 내가 간과하고있는 것이 무엇인지 간단하다는 것을 알았다. 고마워, 정말 고마워. – dayman