Rails - 如何在创建后验证属性的存在

时间:2014-07-27 14:29:35

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

在我的设计注册页面中,我实施了一项IP跟踪功能,当用户注册时,会发送用户来自的国家/地区,以便填充新创建的帐户的属性user_country。< / p>

我想知道是否可以在-user_country上实现一种验证,就像我对其他用户属性(emailpassword ...)一样,当用户是创建,在user_country上实现一种验证,以确保它不是空的也不是零,即用户必须始终确定一个国家。

我无法使用validates :user_country, presence: true的经典方式,因为在创建用户时,user_country仍未填充,但 WAITS,RegistrationController 会调用地理编码器这种方式=&gt;请参阅底部名为'after_sign_up_path_for'的方法

/app/controllers/registrations_controller.rb

class RegistrationsController < Devise::RegistrationsController

  layout 'lightbox'

  def update     
    account_update_params = devise_parameter_sanitizer.sanitize(:account_update)

    # required for settings form to submit when password is left blank
    if account_update_params[:password].blank?
      account_update_params.delete("password")
      account_update_params.delete("password_confirmation")
    end    
    @user = User.find(current_user.id)
    if @user.update(account_update_params) # Rails 4 .update introduced with same effect as .update_attributes
      set_flash_message :notice, :updated
      # Sign in the user bypassing validation in case his password changed
      sign_in @user, :bypass => true
      redirect_to after_update_path_for(@user)
    else
      render "edit"
    end
  end

  # for Rails 4 Strong Parameters
  def resource_params
    params.require(:user).permit(:email, :password, :password_confirmation, :current_password, :user_country)
  end
  private :resource_params

  protected
    def after_sign_up_path_for(resource)
      resource.update(user_country: set_location_by_ip_lookup.country) #use concerns/CountrySetter loaded by ApplicationController
      root_path
    end  

end

在这种情况下,有没有办法实现某种“验证”?

1 个答案:

答案 0 :(得分:2)

我的理解是您希望User模型验证user_country字段,但仅限于首次创建后的步骤中?

class User
   validates_presence_of :user_country, on: :update
end

只会在更新时验证而不是创建。有关您可以添加的其他选项,请参阅http://apidock.com/rails/ActiveRecord/Validations/ClassMethods/validates_presence_of

但是对于您的用例,在注册后需要在控制器中执行此操作似乎很奇怪。我认为总是验证user_country然后在控制器中创建用户期间注入属性更有意义。