在我的控制器中,我使用@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
答案 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
。
在方法内部创建了局部变量token
,digest
以下2行,仅此而已。
token = send("#{attribute}_token")
digest = send("#{attribute}_digest")
现在,当你做某事时,
self.token = User.new_token
您实际上是尝试在类token=
的对象上调用setter方法Invitation
。由于您没有定义此类方法,因此没有此类方法存在错误。