我有一个guest_user和current_user系统,其设计允许guest_users创建订单。这些都在本地工作。
尽管,但是在heroku中,我遇到了错误。
我收到的第一个错误是因为没有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的create方法中,我有:
if user_signed_in?
@order.buyer_id = current_user.id
else
@order.buyer_id = guest_user.id
end
所以我需要买家的ID。令人困惑的是,这一切都只能在本地运行,而不能在Heroku上运行