2014-11-24 2 views
1

테이블의 다양한 행에 assign_attribute을 입력하고 루프로 함께 저장하려고합니다. 그래서 여기 내가하려고하는 방법이다, assign_attributes 및 나중에 루프 루비 레일에 저장

player_arr = [] 
params[:player_types].each do |index,p_type_params| 
    if p_type_params[:id] 
    player_arr << @player_types.find(p_type_params[:id]).assign_attributes(p_type_params) 
    end 
end 

나중에 나는, 트랜잭션 등 모든 업데이트에 원자

ActiveRecord::Base.transaction do 
    player_arr.each do |p_type| 
    p_type.save 
    end 
end 

을 저장하지만 p_type이 보인다이 작동하지 않는 것 수행 할 NilClass 수 있습니다. 나는 왜 내가 player_arr.length를 할 때 나는 양수를 갖기 때문에 왜 이해하지 못한다. 또한 첫 번째 루프에서 모든 할당 오류를 캡처 한 다음 원자 저장을 수행하는 것이 목표입니다. Ofcourse는 첫 번째 루프 자체에서 저장할 수 있지만 첫 번째 발생한 오류 만 캡처합니다. 모든 포인터가 정말 도움이 될 것입니다.

답변

1

문제는 한 줄에 너무 많이 쓰고있는 것처럼 보입니다. 여기

player_arr << @player_types.find(p_type_params[:id]).assign_attributes(p_type_params) 

에는 player_arr 배열 assign_attributes (nil)의 반환 값을 부가한다.

이 대신 수행이 잘 작동하지만

player_arr = [] 
params[:player_types].each do |index,p_type_params| 
    if p_type_params[:id] 
    player = @player_types.find(p_type_params[:id]) 
    player.assign_attributes(p_type_params) 
    player_arr << player 
    end 
end 
+0

, 나는) (errors.full_messages을 표시하는 내보기에 @player_types를 사용합니다. 이런 식으로'@ player_types'는 할당하는 동안 발생한 에러 정보를 유지하지 않습니다. – Trancey