У меня есть система guest_user и current_user с устройством devise, которое позволяет guest_users создавать заказы. Это все работает локально.
Хотя, с герою я получаю ошибки.
Первая ошибка, которую я получил, была из-за отсутствия подтверждения guest_user. Поэтому я изменил validate: false
на validate: true
. Тогда я все еще получил ошибки из-за пароля. Когда я добавил пароль, приложение сломалось.
С пользователем current_user, который вошел в систему, он работает нормально. Я не хочу менять модель, чтобы убрать подтверждения, я хочу, чтобы она работала так же, как и локально. Локально, guest_user может создать заказ без ошибок, а затем зарегистрироваться с присутствующими заказами (если электронная почта соответствует order.email
)
Вот ошибка при создании Order
:
2019-01-21T22:06:15.195141+00:00 app[web.1]: D, [2019-01-21T22:06:15.195016 #4] DEBUG -- : [bcc07ad7-f215-4c19-b442-bdc4677b545e] [1m[35m (5.4ms)[0m [1m[31mROLLBACK[0m
2019-01-21T22:06:15.195851+00:00 app[web.1]: I, [2019-01-21T22:06:15.195791 #4] INFO -- : [bcc07ad7-f215-4c19-b442-bdc4677b545e] Completed 422 Unprocessable Entity in 41ms (ActiveRecord: 12.3ms)
2019-01-21T22:06:15.196780+00:00 app[web.1]: F, [2019-01-21T22:06:15.196720 #4] FATAL -- : [bcc07ad7-f215-4c19-b442-bdc4677b545e]
2019-01-21T22:06:15.196867+00:00 app[web.1]: F, [2019-01-21T22:06:15.196813 #4] FATAL -- : [bcc07ad7-f215-4c19-b442-bdc4677b545e] ActiveRecord::RecordInvalid (Validation failed: Password can't be blank):
2019-01-21T22:06:15.196945+00:00 app[web.1]: F, [2019-01-21T22:06:15.196892 #4] FATAL -- : [bcc07ad7-f215-4c19-b442-bdc4677b545e]
2019-01-21T22:06:15.197040+00:00 app[web.1]: F, [2019-01-21T22:06:15.196983 #4] FATAL -- : [bcc07ad7-f215-4c19-b442-bdc4677b545e] app/controllers/application_controller.rb:84:in `create_guest_user'
2019-01-21T22:06:15.197043+00:00 app[web.1]: [bcc07ad7-f215-4c19-b442-bdc4677b545e] app/controllers/application_controller.rb:40:in `guest_user'
2019-01-21T22:06:15.197045+00:00 app[web.1]: [bcc07ad7-f215-4c19-b442-bdc4677b545e] app/controllers/orders_controller.rb:101:in `create'
Вот код устройства, который у меня есть в контроллере приложения для использования guest_user
:
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
devise_parameter_sanitizer.permit(:account_update, keys: [:name])
end
def current_or_guest_user
if current_user
if session[:guest_user_id] && session[:guest_user_id] != current_user.id
logging_in
# reload guest_user to prevent caching problems before destruction
guest_user(with_retry = false).try(:reload).try(:destroy)
session[:guest_user_id] = nil
end
current_user
else
guest_user
end
end
# find guest_user object associated with the current session,
# creating one as needed
def guest_user(with_retry = true)
# Cache the value the first time it's gotten.
@cached_guest_user ||= User.find(session[:guest_user_id] ||= create_guest_user.id)
rescue ActiveRecord::RecordNotFound # if session[:guest_user_id] invalid
session[:guest_user_id] = nil
guest_user if with_retry
end
private
def logging_in
guest_orders = guest_user.orders.all?
guest_orders.each do |order|
order.user_id = current_user.id
order.save!
end
end
def create_guest_user
u = User.new(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(100)}@example.com")
u.save!(:validate => true)
session[:guest_user_id] = u.id
u
end
Ранее у меня было u.save!(:validate => false)
, но я получил ошибки из-за отсутствия подтверждения - хотя это работало локально.
Я пытался добавить :password => "#{Time.now.to_i}"
и :password = SecureRandom.urlsafe_base64
, но тогда сервер heroku не работал бы вообще.
Что я могу сделать, чтобы guest_user мог создавать заказы без этих проблем так же, как он работает локально?
Модель пользователя:
devise :database_authenticatable, :registerable,
:confirmable, :recoverable, :rememberable, :validatable,
:trackable
after_create :connect_orders
def active_for_authentication?
super && approved
end
def inactive_message
approved? ? super : :not_approved
end
def connect_orders
Order.where(email: self.email).update_all(buyer_id: self.id)
end
В моем методе создания в OrdersController у меня есть:
if user_signed_in?
@order.buyer_id = current_user.id
else
@order.buyer_id = guest_user.id
end
Так что мне нужен идентификатор покупателя. Что сбивает с толку, так это все работает локально, просто не работает Heroku