ruby-on-rails - 通过 :test 导致 ArgumentError: 参数数量错误(给定 0,预期 2..3)
问题描述
这两项工作:
Rails.application.credentials.development
Rails.application.credentials.send(:development)
但是,第一个.test
有效,但 (:test) 无效。
Rails.application.credentials.test
Rails.application.credentials.send(:test)
为什么 :test 很特别?什么会使这不起作用?我明白了
[5] pry(#<Cred>)>Rails.application.credentials.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):5:in `test'
解决方案
test
是Kernel
模块中定义的私有方法。Kernel
包含在每个 ruby 对象中。当你调用.send(:test)
这个方法时,它需要 2 或 3 个参数。
它也可以在其他对象上复制:
[15] pry(main)> :a.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):23:in `test'
[16] pry(main)> 1.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):24:in `test'
编辑
我不确定 object 是什么credentials
,所以我不能肯定地说是这样,但是当你定义method_missing
它时,它是在直接调用私有方法之前调用的,而不是 with send
,见下文:
class B
def method_missing(*args)
puts args
end
end
pry> B.new.send(:test)
ArgumentError: wrong number of arguments (given 0, expected 2..3)
from (pry):32:in `test'
pry> B.new.test
test
=> nil
编辑2:
一般比#send
#public_send
. 它不会让您调用私有方法,并且它会被以下方法捕获#method_missing
:
[28] pry(main)> B.new.public_send(:test)
test
=> nil
推荐阅读
- selenium-webdriver - 使用数据绑定中的参数选择 xpath 或 css
- docker - docker network create 命令 - 群
- php - 通过传递一个值从 json 返回单个数组
- python - 使用 Google Python API 客户端获取所有电子邮件
- java - jooq 3.12.0 codegen 工具策略类未找到
- php - 如何使用 php 将“http://myweb.com/event/12”之类的任何路由重定向到我的 index.html?
- python - 使用 request.get 时如何跳过字符串中的错误 url?
- javascript - 我想帮助在 Angular 5 中将 Firebase 数据库对象更改为数组
- sql - 计算有多少个ID(fk),其中ID(fk)相同,但列值!=给定值
- python - 从python上的txt文件中提取数据