在模型中使用设计
Using devise within the models
有没有办法在模型中使用设计函数?比方说,一个范围?
供参考,这就是我的想法:
scope :available, -> {
if user_signed_in?
requestable
else
requestable.where.not(books: {owner_id: current_user.id})
end
}
我需要在此范围内使用 user_signed_in?
和 current_user
。但我不能。有办法吗?
current_user
(同样适用于 user_signed_in?
等设计助手)仅在您的控制器中可用。我一直在解决这个问题,最后将 current_user
传递给我的范围和模型的方法。
模型中:
scope :available, -> (current_user, signed_in) {
if signed_in
requestable
else
requestable.where.not(books: {owner_id: current_user.id})
end
}
在控制器中:
MyModel.available(current_user, user_signed_in?)
另一种方法是使用 request_store(基于机架的全局数据存储)来存储当前请求的 current_user
这些方法不适合在模型中使用。模型也应该在控制器之外工作(即直接从 Rails 控制台)。
更详细的推理见:
Access to current_user from within a model in Ruby on Rails
此外,没有全局 'store' 知道哪些用户当前已登录 - 这是在请求中确定的,通过验证用户在其请求中发送有效的会话信息。
有没有办法在模型中使用设计函数?比方说,一个范围?
供参考,这就是我的想法:
scope :available, -> {
if user_signed_in?
requestable
else
requestable.where.not(books: {owner_id: current_user.id})
end
}
我需要在此范围内使用 user_signed_in?
和 current_user
。但我不能。有办法吗?
current_user
(同样适用于 user_signed_in?
等设计助手)仅在您的控制器中可用。我一直在解决这个问题,最后将 current_user
传递给我的范围和模型的方法。
模型中:
scope :available, -> (current_user, signed_in) {
if signed_in
requestable
else
requestable.where.not(books: {owner_id: current_user.id})
end
}
在控制器中:
MyModel.available(current_user, user_signed_in?)
另一种方法是使用 request_store(基于机架的全局数据存储)来存储当前请求的 current_user
这些方法不适合在模型中使用。模型也应该在控制器之外工作(即直接从 Rails 控制台)。
更详细的推理见:
Access to current_user from within a model in Ruby on Rails
此外,没有全局 'store' 知道哪些用户当前已登录 - 这是在请求中确定的,通过验证用户在其请求中发送有效的会话信息。