before_validation在更新属性后不修改数据

时间:2015-02-24 17:48:56

标签: ruby-on-rails

我在模型中有以下代码,除了数字之外的所有电话号码。

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正在其他一些自己运行。但我不确定。

1 个答案:

答案 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