Предоставление Гостям возможности создавать записи на Heroku - PullRequest
0 голосов
/ 22 января 2019

У меня есть система 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...