На моей странице регистрации devise я реализовал функцию отслеживания ip, которая, когда пользователь подписывается, отправляет страну пользователь приходит, чтобы заполнить атрибут вновь созданной учетной записи 'user_country'Проверка Rspec для проверки пользователя получает заполненный заполненный атрибут ip_location (Rails 4/devise/geocoder)
Это работает, но как новичок Я не знаю, как проверить с помощью rspec, что это работает, т.е. если я создаю пользователя, который подписывает а затем ПОСЛЕ создания учетной записи, то user_country больше не пуст.
Вот как я использую метод /app/controllers/registrations_controller.rb назначить страну для вновь созданного accoun пользователя на контроллерах/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
Если это помогает, это как я нахожу страну посетителя:
module CountrySetter
extend ActiveSupport::Concern
included do
before_filter :set_location_by_ip_lookup
end
# we use geocoder gem
# output: ip address
def set_location_by_ip_lookup
if Rails.env.development? or Rails.env.test?
Geocoder.search(request.remote_ip).first
else
request.location
end
end
end
Я вижу, что вы делаете 'if Rails.env.development? или Rails.env.test? '. Будьте предельно осторожны при использовании литералов '' '' '' 'или' в Ruby, потому что они предназначены для использования в потоке управления, а не в булевых выражениях. Использование их без понимания их побочных эффектов может вызвать серьезные проблемы, такие как выражение всегда возвращает true. – rickypai
также 'и' 'или' имеют более низкий порядок работы, чем '&&' '||' http://www.techotopia.com/index.php/Ruby_Operator_Precedence – rickypai
спасибо за эти советы: я буду осторожен и попытаюсь понять разницу между AND vs && + Or vs || => как новичок Rails, я думал, что это в основном то же самое :) Я проверю это – Mathieu