允许访客在Heroku上创建记录

时间:2019-01-21 22:42:07

标签: ruby-on-rails ruby heroku devise

我有一个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上运行

0 个答案:

没有答案