关于update_attributes!,如果参数没有更改,对应model层的validation没有被触发

transcosmos 2016-03-02 12:16:38
centroller层执行保存和一时保存的代码:

@shain_tmp = ShainTmp.find_by_id(params[:id])
......
#一时保存的时候,设置为0;保存时,设置为1
Thread.current[:save_status_flg] = 0
@shain_tmp.update_attributes!(params[:shain_tmp])


model层关系:

class ShainTmp < ActiveRecord::Base
......
has_many :gakureki_tmps, :dependent => :destroy, :order => "day_to"
accepts_nested_attributes_for :gakureki_tmps,
:allow_destroy => true,
:reject_if => :all_blank
attr_accessible :gakureki_tmps_attributes
......
end

class GakurekiTmp < ActiveRecord::Base
belongs_to :shain_tmp
attr_accessible :created_by, :day_from, :day_to, :del_flg, :dept, :dept_en, :end_cd, :lock_version, :memo, :school, :school_en, :seq_no, :start_cd, :subject, :subject_en, :updated_by

#非空判断
validates :end_cd, data_presence: { null_val: "20", tabname: @tabname },if: Proc.new { Thread.current[:save_status_flg] != 0 }
......
end


params[:shain_tmp]内容:

{"sei"=>"XX", "mei"=>"XX","job_cd"=>"",
"gakureki_tmps_attributes"=>{"0"=>{"id"=>"2593", "start_cd"=>"", "day_from"=>"",
"end_cd"=>"", "day_to"=>"", "school"=>"", "school_en"=>"", "dept"=>"", "dept_en
"=>"", "subject"=>"", "subject_en"=>"", "memo"=>"", "_destroy"=>"false"}},......}



对于gakureki_tmps表的end_cd字段,当 Thread.current[:save_status_flg] 的值是0以外的值,会进行非空判断。

现在有这么个情况,我首先在页面上点了一时保存button, Thread.current[:save_status_flg] 的值是 0, 所以gakureki_tmps表的end_cd字段不进行非空判断,对于param传过来的参数顺利保存了,然后我在页面上又点了保存button,params参数没有做任何修改,此时Thread.current[:save_status_flg] 的值是 1,正常来说gakureki_tmps表的end_cd字段会进行validation判断。但是因为params没有改变,所以执行@shain_tmp.update_attributes!(params[:shain_tmp])的时候,gakureki_tmps表的记录被忽略了
...全文
8575 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

2,763

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 Ruby/Rails
社区管理员
  • Ruby/Rails社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧