为什么我会得到一个TypeError:没有将符号隐式转换为Integer?

时间:2016-08-05 10:46:01

标签: ruby

我正在玩嵌套的哈希。任务:

  

首先创建名为person1person2person3的三个哈希值   密钥:first:last下的姓氏和姓氏。然后创建一个参数   哈希,以便params[:father]person1params[:mother]person2,   params[:child]person3。例如,验证是否   params[:father][:first]具有正确的价值。

我的解决方案:

person1 = {first: "first_name1", last: "last_name1"}
person2 = {first: "first_name2", last: "last_name2"}
person3 = {first: "first_name3", last: "last_name3"}
params = { :father => ":person1", :mother => ":person2", :child => ":person3" }

然后params[:father][:first]给出

  

TypeError:没有将符号隐式转换为Integer

为什么呢?我不明白为什么会遇到TypeError。

3 个答案:

答案 0 :(得分:4)

params哈希键分配值时,提供字符串而不是personx哈希值。正确的方法是代替

params = { :father => ":person1"...

params = { :father => person1...

错误的原因如下。这一行:

params[:father][:first]

首先获取params[:father]的值。您希望此值为哈希值,但由于上面的语法错误,它是一个字符串。 String确实像哈希一样实现[]方法,但它的语义不同。它通过整数索引访问字符串中的字符。它希望索引作为参数传递给[]

由于您传递了符号[:first],并且没有将符号转换为整数的默认方式,因此会出现相应的错误:

  

TypeError:没有将符号隐式转换为Integer

答案 1 :(得分:0)

使用这些变量名称。如下所示:

params = { :father => person1, :mother => person2, :child => person3 }

答案 2 :(得分:0)

出现此错误的原因如下...

而不是这样做

<%= form.fields_for :terms, term do |term_form| %>

我正在这样做...

<%= form.fields_for :terms_attributes, term do |term_form| %>