【问题标题】:newbie: how to pass User to Asset model for custom method?新手:如何将用户传递给自定义方法的资产模型?
【发布时间】:2012-03-05 09:45:09
【问题描述】:

尝试在我的资产模型中使用 current_user.id(设计),只有 current_user.id 不可用。如何使 current_user.id 在我的资产模型中可用? (以某种方式将用户传递给资产模型?)

  after_save :set_photo

  def set_photo
    user = User.find_by_id(1)
    # user = User.find_by_id(current_user.id)  <-- should be this
    user.has_photo = true
    user.save
  end

【问题讨论】:

  • 您无法访问模型中的当前用户,因为它是设计提供的辅助方法。如果你用谷歌搜索“在模型中使用 current_user”,你会发现一个实现多线程的解决方案,但我个人避免这样做,特别是如果我使用 ActiveRecord,因为它可能与 AR 的连接池发生冲突。
  • 顺便说一句,你能详细说明你想要做什么。我可以理解,如果保存了任何资产对象,您希望将当前用户的 has_photo 字段设置为 true。您将 Asset 用于什么,它是否与 User 相关联?如果您想要一个简单直接的解决方案,那么在assets#createassets#update 中,您可以简单地为current_user 更新has_photo 字段(如果您愿意,可以在用户中创建一个实例方法)如果创建或更新成功.
  • 资产属于用户?谢谢
  • “如果资产被删除,如何在更新操作中检测到​​”.. 你是什么意思?删除是指删除资产还是说用户可以添加或删除图像的某种形式?
  • 嗯..so,资产属于用户。然后,用户拥有一个(或多个)资产。那么,您允许当前用户创建资产,对吗?很抱歉,但我需要有关整个场景的更多信息,以便能够提出更具体的建议。

标签: ruby-on-rails ruby-on-rails-3 inheritance activerecord models


【解决方案1】:

您不能在模型范围内的回调链中使用current_user。这是因为current_user 是请求-响应周期的属性。此外,必须在模型中使用 current_user 几乎可以肯定意味着您的数据库设计不充分或错误。

例如在您的情况下,为什么在更新Asset 时尝试更新User 的属性?除非它们是相关的,否则这是一种特定的代码气味。

您可以尝试以下几件事:

  1. 更正 DB 设计问题 - 定义 AssetUser 之间的关联。然后,您可以在控制器中执行 @asset.user = current_user(或类似的操作)。
  2. 丑陋的蛮力方法:不要依赖回调并在控制器中显式调用您的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多