在模型中使用设计

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' 知道哪些用户当前已登录 - 这是在请求中确定的,通过验证用户在其请求中发送有效的会话信息。