【问题标题】:Refactor model method not working重构模型方法不起作用
【发布时间】:2015-11-01 10:08:12
【问题描述】:

在我的控制器中,我使用@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

【问题讨论】:

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


    【解决方案1】:

    你完全错了。您必须按如下方式进行动态调用:

    def create_digest(attribute)
       token = self.public_send "#{attribute}_token=", User.new_token
       self.public_send "#{attribute}_digest=", User.digest(token)
    end
    

    public_send 最好在调用 public 方法时使用,而不是使用send

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

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

    现在,当你在做类似的事情时,

    self.token  = User.new_token
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 2018-09-07
      • 1970-01-01
      • 2011-10-18
      相关资源
      最近更新 更多