0
나는 동시에 두 개의 서로 다른 모델의 하나의 형태에서 가져온 값을 업데이트 할

, 나는 그렇게하려면 다음 코드를 작성했습니다 : -레일 : 여러 모델을 업데이트하여 여러개의 속성이 동시에

if @mess.update_attributes!(:mess_name => params[:mess_name_update], :mess_capacity => params[:mess_capacity_update]) && @mess_price.update_attributes!(:breakfast_charge => params[:mess_breakfast_charge_update], :lunch_charge => params[:mess_lunch_charge_update], :dinner_charge => params[:mess_dinner_charge_update], :monthly_charge => params[:mess_monthly_charge_update], :semesterly_charge => params[:mess_semesterly_charge_update], :start_date => params[:start_date_update], :end_date => params[:end_date_update], :rebate => params[:rebate_update]) 
     flash[:success] = "Mess Details Updated Successfully!!" 
    else 
     flash[:error] = "Some Error! Please Try Again!" 
    end 

그러나 위의 코드는 다음과 같은 오류를

액티브 :: RecordInvalid

을주고있다

검증 실패 : 비워 둘 수 없습니다 시작 날짜

다음은의 MessPrice @messMessType 모델 및 @mess_price를 들어, 모델 내가 사용하고있는 두 개의 스키마입니다 :

MessType 
+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| mess_id  | int(11)  | NO | PRI | NULL | auto_increment | 
| mess_name  | varchar(255) | NO |  | NULL |    | 
| mess_capacity | int(11)  | NO |  | NULL |    | 
| start_date | date   | No |  | NULL |    | 
| created_at | datetime  | NO |  | NULL |    | 
| updated_at | datetime  | NO |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

MessPrice 
+-------------------+----------+------+-----+---------+----------------+ 
| Field    | Type  | Null | Key | Default | Extra   | 
+-------------------+----------+------+-----+---------+----------------+ 
| id    | int(11) | NO | PRI | NULL | auto_increment | 
| breakfast_charge | float | YES |  | NULL |    | 
| lunch_charge  | float | YES |  | NULL |    | 
| dinner_charge  | float | YES |  | NULL |    | 
| monthly_charge | float | YES |  | NULL |    | 
| semesterly_charge | float | YES |  | NULL |    | 
| rebate   | float | YES |  | NULL |    | 
| start_date  | date  | YES |  | NULL |    | 
| end_date   | date  | YES |  | NULL |    | 
| mess_id   | int(11) | YES | MUL | NULL |    | 
| created_at  | datetime | NO |  | NULL |    | 
| updated_at  | datetime | NO |  | NULL |    | 
+-------------------+----------+------+-----+---------+----------------+ 
+0

'update_attributes를 코드를 읽기 쉽게 만들기 및 트랜잭션에서 실행 추천 할 것입니다 params[:something][:xyz]

를 통해 액세스 할 필요가 될 수있다! '해야하지 'params'에서 값을 바꿀 수 있습니다. 값이'nil'으로 시작하는지 확인하기 위해'if' 전에 디버그 문으로'params' 값을 검사 했습니까? – lurker

+0

@mbratch 예''null '이 아닌 값을 반환하는'params' 값을 확인했습니다. – hiteshtr

+0

그건 문제가되지 않습니다. 모델 업데이트를 교환 해 보셨습니까? 두 번째 모델을 먼저 업데이트 한 다음 첫 번째 모델을 업데이트합니다. 차이가 없어야합니다. –

답변

1

나는 awesome_print 보석을 설치하는 것이 좋습니다 - https://github.com/michaeldv/awesome_print

# add to Gemfile 
gem 'awesome_print' 
# install 
bundle 

다음으로 콘트로 크 로스 조치가

logger.debug " -----------" 
logger.ap params 
logger.debug " -----------" 

출력에 대한 로그 파일 log/development.log을 확인 할, 그것은 PARAMS 당신이 기대하는 것을 제대로 아니라에서 오는 될 수 있을까? 속성 중 일부는 다른 해시 키에 중첩와 나는 또한

@mess.mess_name = params[:mess_name_update] 
@mess.mess_capacity = params[:mess_capacity_update] 

@mess_price.breakfast_charge = params[:mess_breakfast_charge_update] 
@mess_price.lunch_charge = params[:mess_lunch_charge_update] 
@mess_price.dinner_charge = params[:mess_dinner_charge_update] 
@mess_price.monthly_charge = params[:mess_monthly_charge_update] 
@mess_price.semesterly_charge = params[:mess_semesterly_charge_update] 
@mess_price.start_date = params[:start_date_update] 
@mess_price.end_date = params[:end_date_update] 
@mess_price.rebate = params[:rebate_update] 

# NOTE: an alternative to above is to name your html input fields the rails way 
# so that params are sent in a nested hash, i.e. "mess_price[start_date]" -> params[:mess_price][:start_date] 
# then you can do @mess_price.update_attributes(params[:mess_price]) 
# using form_for html helper will automatically apply this style of naming to html input fields 

Mess.transaction do 
    # you might want save! vs save - depends if you show validation error in the UI or not 
    if @mess.save && @mess_price.save 
    flash[:success] = "Mess Details Updated Successfully!!" 
    else 
    # don't save changes, show validation errors 
    raise ActiveRecord::Rollback 
    flash[:error] = "Some Error! Please Try Again!" 
    end 
end 
관련 문제