在我的设计注册页面中,我实施了一项IP跟踪功能,当用户注册时,会发送用户来自的国家/地区,以便填充新创建的帐户的属性user_country
。< / p>
我想知道是否可以在-user_country上实现一种验证,就像我对其他用户属性(email
,password
...)一样,当用户是创建,在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
在这种情况下,有没有办法实现某种“验证”?
答案 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
然后在控制器中创建用户期间注入属性更有意义。