【问题标题】:Using devise within the models在模型中使用设计
【发布时间】:2015-08-06 22:26:50
【问题描述】:

有没有办法在模型中使用设计函数?比方说,一个范围?

作为参考,这是我的想法:

scope :available, -> {
    if user_signed_in?
        requestable
    else
        requestable.where.not(books: {owner_id: current_user.id})
    end
}

我需要在这个范围内使用user_signed_in?current_user。但我不能。有什么办法吗?

【问题讨论】:

  • 为什么不能使用它们?这两种方法在其他模型中都可用,例如 User 模型需要设计,因为这就是 gem 的目的。
  • 哦,呵呵。它们被设置为在控制器而不是模型中使用。我是健忘对不起!
  • 所以答案是直接的“否”?没关系(只是令人失望):(
  • 非常不鼓励......我会写一个快速的答案,但我不确定我能提供多少帮助。
  • 看来我被打败了!在查看 axel 的答案后,我实际上将其标记为他链接的问题的副本(即使它不是严格设计,它本质上是相同的问题/解决方案)stackoverflow.com/questions/1568218/…

标签: ruby-on-rails ruby-on-rails-4 devise


【解决方案1】:

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

【讨论】:

  • 我想我最好在控制器中执行有关用户的逻辑,并围绕它调整我的范围。将它们作为参数传入感觉很笨拙。感谢您的回答。
  • 好主意。虽然我觉得这可能是 MVC 达到其极限的地方,但在我看来,让诸如 current_user 之类的数据可以在全球范围内访问是正确的
【解决方案2】:

此类方法不适用于模型。模型也应该在控制器之外工作(即直接从 Rails 控制台)。

更详细的推理参见:

Access to current_user from within a model in Ruby on Rails

此外,没有全局“商店”知道哪些用户当前已登录 - 这是在请求中确定的,通过验证用户在其请求中发送有效会话信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多