模型中未定义的方法,但其他方法有效

时间:2017-11-30 10:17:52

标签: ruby-on-rails ruby

我有一个控制器调用用户密码重置流的模型。它调用两种方法:

控制器

Password.new(@user)
  .save_token_and_expiry
  .email_reset

模型

module ModuleName
  class Password

    attr_accessor :token, :user

    def initialize(user)
      @token = SecureRandom.urlsafe_base64(ModuleName.configuration.reset_token_length, false)
      @user = user
    end

    def save_token_and_expiry
      User.find_by_email(@user['email'])
        .update_attributes(password_reset_token: @token, password_token_expiry: ModuleName.configuration.password_token_expiry)
    end

    def email_reset
      PasswordResetMailer.password_reset(@user, @token).deliver_now
    end
  end
end

输出

NoMethodError (undefined method `email_reset' for true:TrueClass):

第一个成功执行,但第二个失败。

为什么第二种方法会返回错误?

3 个答案:

答案 0 :(得分:2)

您的public void onAudioData(byte[] data, int size) { buffer.write(data); } } 方法会返回save_token_and_expiry,您尝试调用true方法,这显然会失败。如果你想允许这样的链接,你可以使email_reset方法返回save_token_and_expiry实例,它被调用:

Password

答案 1 :(得分:0)

Rails 对链接通话不太友好。 save_token_and_expiry会返回最后一次调用操作的结果(update_attributes),而update_attributes不会返回调用它的目标,只是简单的true / false。这就是你有这样的错误的原因。如果要修复它,可以将save_token_and_expiry方法重写为:

def save_token_and_expiry
  User.find_by_email(@user['email']).update_attributes(password_reset_token: @token, password_token_expiry: ModuleName.configuration.password_token_expiry)
  self
end

答案 2 :(得分:0)

您可以更改控制器代码:

@data = Password.new(@user)
@data.save_token_and_expiry
@data.email_reset