Rails - как проверить наличие атрибута ПОСЛЕ создания

На моей странице регистрации устройства я реализовал функцию отслеживания IP-адресов, которая, когда пользователь регистрируется, отправляет страну, из которой он пришел, для заполнения атрибута вновь созданной учетной записи. user_country,

Я хотел бы знать, возможно ли реализовать своего рода проверку на -user_country так же, как и для других атрибутов пользователя (email, password...) когда пользователь создан, для реализации своего рода проверки на user_country чтобы быть уверенным, что он не пустой и не нулевой, то есть пользователь всегда должен идентифицировать страну.

Я не могу использовать классический способ с validates :user_country, presence: trueпотому что, когда пользователь создан user_country еще не заполнен, но ЖДЕТ, что RegistrationController делает вызов геокодеру таким образом => см. метод в нижней части, называемый 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 ответ

Решение

Я понимаю, что вы хотите 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 затем введите атрибут при создании пользователя в контроллере.

Другие вопросы по тегам