ruby-on-rails - 如何在模型中使用设计或使用“如果 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
解决方案
最终找到了一个关于类似的东西的 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
现在无论如何,即使是客人,也有人是用户。如果使用相同的电子邮件并确认电子邮件,则可以在下订单后创建一个帐户并列出他们的订单。
推荐阅读
- ios - Swift JSONDecoder 解码错误:错误:执行被中断,原因:EXC_BAD_ACCESS (code=1, address=0x5e48)
- machine-learning - 使用 XGBOOST 的不平衡多类数据
- javascript - 单击 2 个不同的 div 以取消选择它们时出现 StaleElementReferenceError
- git - Git克隆铬
- java - 在 Spring 中调用 REST 方法进行注释检测
- powershell - Powershell ScriptBlock 关闭:我错过了什么吗?
- php - 我无法从表单中删除 Woocommerce rest api 产品
- firebase - 无法无条件调用方法“[]”,因为接收者可以为“null”
- react-native - 如何将所选数据从 Flatlist 传递到另一个屏幕
- python - odoo 表中只有一次字段