На странице регистрации моего устройства я реализовал функцию отслеживания IP-адресов, которая, когда пользователь регистрируется, отправляет страну, из которой он пришел, чтобы заполнить атрибут только что созданной учетной записи «user_country».
Это работает, но как новичок я не знаю, как проверить с помощью rspec, что это работает, т. е. если я создам пользователя, который зарегистрируется, то ПОСЛЕ создания учетной записи эта страна_пользователя больше не будет пустой.
Вот как я использую метод /app/controllers/registrations_controller.rb для назначения страны вновь созданной учетной записи пользователя на 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
Если это поможет, вот как я нахожу страну посетителя:
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? or Rails.env.test?
. Будьте КРАЙНЕ осторожны при использовании литералаand
or
в Ruby, потому что они предназначены для использования в потоке управления, а не в логических выражениях. Использование их без понимания их побочных эффектов может вызвать серьезные проблемы, например, если выражение всегда возвращает true. - person rickypai   schedule 27.07.2014and
or
имеют гораздо более низкий порядок операций, чем&&
||
techotopia.com/index.php/Ruby_Operator_Precedence< /а> - person rickypai   schedule 27.07.2014