获取在 rails 中不起作用的可选参数

use*_*413 0 ruby ruby-on-rails ruby-on-rails-5

我正在向方法发送可选参数,但未收到它们。使用 binding.pry 我已经检查过但未收到链接参数,但在 send_email 方法中收到了 id 参数。它总是作为零返回。请帮忙找出我出错的地方

class EmailsController < MyAccountController
    def send_emails
      @user = current_user
      id = @user.id
      HiringMailer.send_email(id, link: true).deliver_now
    end
end


class HiringMailer < ApplicationMailer
  def send_email(id, joining = false, options={})
    link = options[:link]
    binding.pry_remote
    @user = User.find(id)
    @joining_user = joining
    to = (['abc@yah.com', 'adx@yah.com']).flatten
    mail to: to, subject: "Joining Date"
  end
end
Run Code Online (Sandbox Code Playgroud)

更新 1

HiringMailer.send_email(id, link: true).deliver_now

def send_email(id, joining = false, , **options)
 binding.pry_remote
end
Run Code Online (Sandbox Code Playgroud)

Tom*_*ord 5

link: true论点是越来越被吞噬joining变量。

让我解释。这是方法签名:

def send_email(id, joining = false, options={})
Run Code Online (Sandbox Code Playgroud)

现在,如果您使用: 调用该方法send_email(123, link: true),那么我们最终会得到:

id = 123
joining = {link: true}
options = {}
Run Code Online (Sandbox Code Playgroud)

为了防止这种不必要的影响,您需要明确传递所有三个变量:send_email(123, false, link: true).

...但是等等,还有更好的方法!改用关键字参数。您可以像这样定义方法:

def send_email(id, joining: false, **options)
Run Code Online (Sandbox Code Playgroud)

并像您之前所做的那样称呼它:

send_email(123, link: true)
Run Code Online (Sandbox Code Playgroud)

唯一的细微差别(坦率地说,这是一个明显的改进)是,如果要设置,则需要稍微不同地调用该方法joining = true

# Before:
send_email(123, true, link: true)

# After:
send_email(123, joining: true, link: true)
Run Code Online (Sandbox Code Playgroud)