我在模型中有以下代码,除了数字之外的所有电话号码。
before_validation :strip_phone_numbers
def strip_phone_numbers
self.home_phone.gsub!(/[^0-9]/, '') if self.home_phone.present?
self.work_phone.gsub!(/[^0-9]/, '') if self.work_phone.present?
self.mobile_phone.gsub!(/[^0-9]/, '') if self.mobile_phone.present?
end
现在这适用于控制器#create,但对于更新,它不会修改数据。以下是更新操作:
def update
@user = User.find(params[:id])
respond_to do |format|
if @user.update_attributes(params[:user])
flash[:success] = 'The user was successfully updated.'
format.html { redirect_to(@user) }
else
format.html { render :action => "edit" }
end
end
end
我倾向于责怪update_attributes,因为before_validation正在其他一些自己运行。但我不确定。
答案 0 :(得分:1)
当您致电保存时,ActiveRecord
会检查是否有任何属性已更改。如果没有变化,则不会更新模型
使用gsub!
,您只需要抓取字符串并更改其值。这不会告诉ActiveRecord
属性已更改,因此模型不会更新
ActiveRecord
使用属性setter来保留模型中的更改,因此您需要使用它们:
def strip_phone_numbers
self.home_phone = self.home_phone.gsub(/[^0-9]/, '') if self.home_phone.present?
self.work_phone = self.work_phone.gsub(/[^0-9]/, '') if self.work_phone.present?
self.mobile_phone = self.mobile_phone.gsub(/[^0-9]/, '') if self.mobile_phone.present?
end