0

我想更新在同一时间在两个不同的模式,从一个单一的形式获得的值,我写了下面的代码,这样做: -Rails的:多模式的更新多发性属性同时

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

验证失败:开始日期不能为空

以下是两种模式我使用,为@messMessType模型和@mess_priceMessPrice型号:

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'中的值。你是否在if语句之前用调试语句检查了'params'值,看看该值是否为“nil”? – lurker

+0

@mbratch是的我已经检查过'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