Как использовать Devise в моделях или использовать "if user_signed_in?" для ассоциаций? - PullRequest
0 голосов
/ 05 января 2019

Проблема: У меня есть ассоциация "own_to" для customer.id, но я также хочу, чтобы люди, которые не вошли в систему, могли создавать заказы.

Так что мне нужна только ассоциация , если пользователь вошел в систему

Как я могу сделать:

belongs_to :buyer, class_name: "User"

, но связывать его можно только если пользователь вошел в систему.

Я пробовал:

belongs_to :buyer, class_name: "User", if: @user.current_user(true)

не работает

belongs_to :buyer, class_name: "User", if: user_signed_in
def user_signed_in
  @user.current_user(true)
end 

не работает

И еще несколько итераций этого.

Я использую Devise, и похоже, что он не работает в моделях так, как в контроллерах.

В контроллере я сделал это: (несколько не актуально)

if user_signed_in?
   @order.buyer_id = current_user.id
 else
   @order.buyer_id = nil
end

Что я могу сделать, чтобы

belongs_to :buyer, class_name: "User"

ассоциируется только когда пользователь вошел в систему?

Моя миграция customer_id:

class AddBuyerIdToOrders < ActiveRecord::Migration[5.2]
  def change
    add_column :orders, :buyer_id, :integer
  end
end

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Закончилось поиском SO-сообщения о чем-то похожем, которое только что использовало 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

privte

  def create_guest_user
    u = User.new(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(100)}@example.com")
    u.save!(:validate => false)
    session[:guest_user_id] = u.id
    u
  end

Теперь, несмотря ни на что, кто-то является пользователем, даже если он гость. И может создать учетную запись после заказа с указанием их заказов, если используется тот же адрес электронной почты и электронная почта подтверждена.

0 голосов
/ 05 января 2019

Вы не можете сделать это таким образом, потому что модель не имеет представления о статусе signed_in. Если вы хотите создавать заказы без пользователей, вы должны добавить optional: true к ассоциации, поскольку Rails проверяет наличие belongs_to, начиная с 5-й версии.

belongs_to :buyer, class_name: "User", optional: true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...