为何Rails credentials的[]访问与send访问表现不一致?
问题:Rails Credentials不同访问方式的行为差异
为什么调用send方法时,传入字符串'production'或符号:production都能正常获取Rails credentials的值,但用[]访问时,字符串键返回nil,符号键却能得到预期结果?代码示例如下:
Rails.application.credentials.send 'production' # {:one => {:two => {:three => 'yay!'}}} Rails.application.credentials.send :production # {:one => {:two => {:three => 'yay!'}}} Rails.application.credentials['production'] # nil Rails.application.credentials[:production] # {:one => {:two => {:three => 'yay!'}}}
原因解析
send方法的特性:Ruby的send方法在接收方法名参数时,会自动将字符串形式的方法名转换为对应符号。Rails Credentials的实例(比如Credentials::EnvironmentCredentials)会为每个顶级credential键生成同名的方法,这些方法名以符号形式存在。所以不管传字符串'production'还是符号:production,send都能匹配到对应的方法,返回正确的credential值。[]方法的类型敏感性:Rails Credentials的[]方法是严格按照键的类型进行匹配的。你的credentials配置里,顶级键被Rails解析成了符号类型:production,而非字符串'production'。因此用字符串作为键查询时,找不到对应的键值对,返回nil;用符号键查询则能精准匹配,返回预期的哈希。
补充说明:Rails在加载credentials的YAML文件时,默认会将文件中的键转换为符号(这是Rails对YAML解析的默认配置),所以所有顶级credential键都是符号类型,这直接导致了[]方法的类型匹配差异。
内容的提问来源于stack exchange,提问作者pixelearth
相关产品推荐
相关产品推荐

