首页 > 解决方案 > 如何在模型中使用设计或使用“如果 user_signed_in?” 为协会?

问题描述

问题: 我有一个买家 ID 的“belongs_to”关联,但我也希望未登录的人能够创建订单。

所以我只需要用户登录时的关联

我能怎么做:

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"

仅在用户登录时关联?

我的buyer_id 迁移:

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

标签: ruby-on-railsrubydevise

解决方案


最终找到了一个关于类似的东西的 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

现在无论如何,即使是客人,也有人是用户。如果使用相同的电子邮件并确认电子邮件,则可以在下订单后创建一个帐户并列出他们的订单。


推荐阅读