Object.attribute_changed?不在Rails控制器中工作

时间:2012-04-25 00:23:52

标签: ruby-on-rails ruby ruby-on-rails-3 devise actioncontroller

我正在覆盖Devise用户的注册控制器以检查用户是否更改了城市,如果是,请在会话中再次加载Geokit对象。

session[:geo_location] = User.geocode(resource.city) if resource.city_changed?

问题是没有这样做。下面的代码没有返回任何内容。如果我删除了if resource.city_changed?,无论资源是否已更改,它都会针对所有情况执行此操作。

 User::RegistrationsController < Devise::RegistrationsController

  def update 
   self.resource = resource_class.to_adapter.get!(send(:"current_#    {resource_name}").to_key)    
    if resource.update_with_password(params[resource_name])

      session[:geo_location] = User.geocode(resource.city) if resource.city_changed?

      set_flash_message :notice, :updated if is_navigational_format?
      sign_in resource_name, resource, :bypass => true
      respond_with resource, :location => after_update_path_for(resource)
    else
      clean_up_passwords(resource)
      respond_with_navigational(resource){ render_with_scope :edit }
    end

  end

end

1 个答案:

答案 0 :(得分:4)

update_with_password是否致电save?如果是这样,它将清除模型的“脏”状态及其所有属性。您需要在设置属性后调用resource.city_changed? ,但在>调用save之前