2012-02-24 3 views
2

나는 레일즈를 backbone.js 사이트의 서버 측으로 사용하고 있으므로 레일 객체를 앞뒤로 계속 전달할 것입니다.레일스는 id에 대한 보호 속성을 대량으로 할당 할 수 없습니다. created_at

레일에서 오류가 발생하여 WARNING: Can't mass-assign protected attributes: id, created_at, updated_at을 반환합니다. 내가

 
Parameters: {"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"}, "created_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"} 

답변

7

JSON에 아무런 문제가 없습니다. 이 문제는 보안 문제 중 하나입니다. Rails는 기본적으로 거대한 해시에서 생성되거나 업데이트되는 것을 막기 위해 특정 속성을 보호합니다. 이것은 "질량 할당"이라는 용어를 사용할 때 오류가 참조하는 것입니다.

json으로 당신이 게시 :

Parameters: {"id"=>1, "updated_at"=>"2011-04-21T16:41:02Z"}, "created_at"=>"2012-02-23T21:01:02Z", "action"=>"test update"} 

idcreated_atupdated_at 필드가 포함되어 있습니다. 이 JSON이 액션에 전달되고 해시가 model_object.update_attributes(hash_fields)에서 사용되면이 오류가 발생합니다. 이 오류를 방지하려면 해시에서 필드를 삭제하고 나중에 할당하거나 이상적으로 ActiveRecord가 마법을 사용하도록하고 이상하게 무시할 수 있습니다.

당신이 정말로에 할당해야하는 경우 당신은 그런 수행 할 수 있습니다 (ID를 다시 전달하는 방법에 대한 주석 해결하기 위해)

model_object.id = id_variable 
model_object.created_at = created_at_variable 
model_object.updated_at = updated_at_variable 
model_object.save 

EDIT1을 : 당신은 레일 REST 모델을 사용하는 경우

을 컨트롤러/: id/action url을 호출하면 해당 정보가 URL에 이미 포함되어 있으므로 ID를 다시 전달할 필요가 없습니다. params[:id]을 통해 액세스하고 params[:model_name]을 통해 해시 (레일스 모델을 따름)를 통해 액세스 할 수 있습니다.

당신이 JSON에 있어야 다른 무언가와 ID 을 수행하는 경우는 다시 전달되는 당신은 단순히 id = params[:model_name][:id].delete을 할 수 있으며, 그 해시에서 ID를 삭제하고 하나의 호출에서 값을 반환합니다. 그것은 이상적은 아니지만 핀치로 일을 끝낼 수 있습니다.

+0

그러나 업데이트는 항상 반환되는 ID가 필요하지만 업데이트되지 않습니다. 제 생각에 그것이 저의 가장 큰 관심사였습니다. 백본에 타임 스탬프를 보내지 않으면 반환되지 않지만 ID를 보내야합니다. 나는 그것이 내가 그렇게 혼란스러워하는 이유라고 생각한다. 레일스가 '나를 보호하는'방법을 알 수 있습니다.하지만이 기회에 왜 이것을 볼 수 있는지 알고 싶습니다. – pedalpete

+0

굉장하고, 당신의 업데이트 @ salt.racer에 감사드립니다. 나는 그 모델에 대한 편안한 업데이트를하고 있지 않았는데, 나는 당신의 코멘트까지는 깨닫지 못했다. 이제 나는 안심하고 갈 수있는 옵션을 가지며 왜이 응답을 얻었는지 이해합니다. – pedalpete

+0

다음과 같은 후속 조치 - 동일한 문제가 발생하여 "최상의"솔루션이 무엇인지 궁금해합니다. 제 경우에는 업데이트시 ID를 삭제하는 중입니다 ... 그러나 다른 값들도 있습니다. 임베디드 애트리뷰트 또는 메쏘드 리턴 (계산 된 라벨과 같은)으로 돌아 왔으므로 업데이트 할 수 없다. 이것을 좀 더 깔끔하게 처리 할 수있는 레일 협약이 있습니까? – MBHNYC

3

그 열이 대량 할당 기본적으로 보호 등을 말할 수있는 지금까지 내 JSON은 매우 정상적인 모습이 필드를 포함했던 적이 있기 때문에

은 물론,이 이상한 찾기 수동으로 설정할 수 없습니다. 그러나, 당신은 방법을 정의하여이 동작을 무시할 수 있습니다 : 이것은 수동 created_atupdated_at를 할당 할 수

def self.attributes_protected_by_default 
    [] # ["created_at", "updated_at" ..other] 
end 

.

+0

감사합니다. Syed, 나는 그들을 타고 싶지 않습니다. 레일즈가 내가 생각하는 원인이 무엇인지 궁금합니다. 어떤 아이디어? – pedalpete

+0

타임 스탬프 (created_at, updated_at)와 id 열이 ActiveRecord에 자동 채워진다는 사실을 알았습니다. 값을 보내면 대량 할당됩니다. –