使用具有 Single Table 继承的私有方法
Using a private method with Single Table Inheritance
我正在开发一个 rails 应用程序,其中有 2 种不同类型的用户(MasterClientUser 和 AccountManager)。我使用单一 table 继承来区分用户。我有一个需要在 AccountManager 和 MasterClientUser 上调用的 update_last_seen_at 私有方法。我试图将它放在用户模型中,但出现以下错误:
private method `update_last_seen_at' called for #<MasterClientUser:0x007fc650d2cad0>
从 HomeController 调用 update_last_seen_at 方法:
class HomeController < ApplicationController
before_action :authenticate_user!, :save_users_access_time, only: [:index]
def index
@user = current_user
end
def save_users_access_time
current_user.update_last_seen_at
end
end
型号
class User < ActiveRecord::Base
end
class MasterClientUser < User
private
def update_last_seen_at
self.update_attributes(last_seen_at: Time.now)
end
end
class AccountManager < User
end
我也试过将方法放入模块中,并将模块包含在每个不同的用户类型中,但我得到了同样的错误。
有什么方法可以让我共享两种用户类型的方法并将其保密,而不必将它们明确地放入每个模型中?/是否有更好的策略来解决这个问题。
将方法定义为在用户 class 中受保护,这将让派生的 classes 使用它。我认为对方法类型的一个很好的(一般的)解释是:What is the difference between Public, Private, Protected, and Nothing?,希望它能帮助你。
虽然 ruby 只支持这个:
Ruby 为您提供三个级别的辅助功能:
每个人都可以调用 - Public 方法 - 不强制执行访问控制。 class 的实例方法(它们不只属于一个对象;相反,class 的每个实例都可以调用它们)默认为 public;任何人都可以给他们打电话。初始化方法始终是私有的。
- 受保护的方法只能由定义 class 及其子class 的对象调用。访问权限保留在家庭内部。但是,protected 的使用是有限的。
- 无法使用显式接收者调用私有方法 - 接收者始终是自己。这意味着私有方法只能在当前对象的上下文中调用;您不能调用另一个对象的私有方法。
def save_users_access_time
current_user.update_last_seen_at
end
您不能自己调用用户外部的私有方法 class,这就是您遇到问题的原因,您可以将该方法更改为普通 public 方法
尽管如此,我实际上认为整个方法都是不必要的,如果它要做的只是更新 last_seen_at
字段,您可以考虑改用 touch
。
def save_users_access_time
current_user.touch(:last_seen_at)
end
我正在开发一个 rails 应用程序,其中有 2 种不同类型的用户(MasterClientUser 和 AccountManager)。我使用单一 table 继承来区分用户。我有一个需要在 AccountManager 和 MasterClientUser 上调用的 update_last_seen_at 私有方法。我试图将它放在用户模型中,但出现以下错误:
private method `update_last_seen_at' called for #<MasterClientUser:0x007fc650d2cad0>
从 HomeController 调用 update_last_seen_at 方法:
class HomeController < ApplicationController
before_action :authenticate_user!, :save_users_access_time, only: [:index]
def index
@user = current_user
end
def save_users_access_time
current_user.update_last_seen_at
end
end
型号
class User < ActiveRecord::Base
end
class MasterClientUser < User
private
def update_last_seen_at
self.update_attributes(last_seen_at: Time.now)
end
end
class AccountManager < User
end
我也试过将方法放入模块中,并将模块包含在每个不同的用户类型中,但我得到了同样的错误。
有什么方法可以让我共享两种用户类型的方法并将其保密,而不必将它们明确地放入每个模型中?/是否有更好的策略来解决这个问题。
将方法定义为在用户 class 中受保护,这将让派生的 classes 使用它。我认为对方法类型的一个很好的(一般的)解释是:What is the difference between Public, Private, Protected, and Nothing?,希望它能帮助你。
虽然 ruby 只支持这个:
Ruby 为您提供三个级别的辅助功能:
-
每个人都可以调用
- Public 方法 - 不强制执行访问控制。 class 的实例方法(它们不只属于一个对象;相反,class 的每个实例都可以调用它们)默认为 public;任何人都可以给他们打电话。初始化方法始终是私有的。
- 受保护的方法只能由定义 class 及其子class 的对象调用。访问权限保留在家庭内部。但是,protected 的使用是有限的。
- 无法使用显式接收者调用私有方法 - 接收者始终是自己。这意味着私有方法只能在当前对象的上下文中调用;您不能调用另一个对象的私有方法。
def save_users_access_time
current_user.update_last_seen_at
end
您不能自己调用用户外部的私有方法 class,这就是您遇到问题的原因,您可以将该方法更改为普通 public 方法
尽管如此,我实际上认为整个方法都是不必要的,如果它要做的只是更新 last_seen_at
字段,您可以考虑改用 touch
。
def save_users_access_time
current_user.touch(:last_seen_at)
end