重构模型方法不起作用

时间:2015-08-09 11:07:13

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

在我的控制器中,我使用@invitation.send_email来调用此模型方法:

def send_email
  create_digest("cycle")
  ...
end

private
  def create_digest(attribute)
    token       = send("#{attribute}_token")
    digest      = send("#{attribute}_digest")
    self.token  = User.new_token         # So this should translate to self.cycle_token
    self.digest = User.digest(token)     # So this should translate to self.cycle_digest
  end

然而,它会引用私有方法中的self.token = User.new_token行的错误:

undefined method `token=' for #<Invitation:0x007f1472d233f8>

似乎无法将self.token转换为self.cycle_token。有人看到我做错了吗?

原始方法如下,但我正在尝试将其重构为更灵活的方法。

def create_cycle_digest
  self.cycle_token  = User.new_token
  self.cycle_digest = User.digest(cycle_token)
end

1 个答案:

答案 0 :(得分:1)

你做错了。您必须按以下方式进行动态调用:

def create_digest(attribute)
   token = self.public_send "#{attribute}_token=", User.new_token
   self.public_send "#{attribute}_digest=", User.digest(token)
end
调用 public 方法而不是使用public_send时,最好使用

send

在方法内部创建了局部变量tokendigest以下2行,仅此而已。

token = send("#{attribute}_token")
digest = send("#{attribute}_digest")

现在,当你做某事时,

self.token  = User.new_token

您实际上是尝试在类token=的对象上调用setter方法Invitation。由于您没有定义此类方法,因此没有此类方法存在错误。