0

Я хочу, чтобы обновить значения, взятые из одной формы в двух различных моделей, в то же время, я написал следующий код, чтобы сделать это: -Rails: обновление атрибутов Mutiple множественной модели одновременно

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 

Но Приведенный выше код дает следующее сообщение об ошибке

ActiveRecord :: RecordInvalid

не удалось выполнить проверку: Дата начала не может быть пустым

Ниже приводится две схемы я использую для @mess его MessType модели и @mess_price его MessPrice модель:

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» с помощью инструкции debug до вашего «if», чтобы узнать, было ли значение «nil» начато? – lurker

+0

@mbratch yes Я проверил значения 'params', они возвращают значения, а не' null' – 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 приходит через правильно, но не то, что вы ожидаете? некоторые из атрибутов может быть вложен в другой хэш ключа и должны быть доступны через params[:something][:xyz]

Я также рекомендовал бы сделать код более читаемым и запустить его в транзакции

@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 
Смежные вопросы