嵌套属性错误:没有将String隐式转换为Integer

时间:2016-02-22 00:16:42

标签: ruby-on-rails params

我的项目模型属于我的订单模型,我的订单模型有很多项目。当我试图传递以下参数时:

{"utf8"=>"✓", "authenticity_token"=>"mPKksp+W5lZc7+lrc90trtCzX+UtPj4PI8boNf7vb+nneMF/J5SSBz8Nmh+CQ//DkmuVP2MJf7gS3oLqpZcM2Q==", "order"=>{"special_instructions"=>"", "item_attributes"=>{"topping_ids"=>["1", "2", "5"]}}, "commit"=>"Save"}

我收到以下错误:

no implicit conversion of String into Integer

我的订单控制器中的创建操作发生错误:

@order = Order.new(order_params)

这是我的params方法的样子:

def order_params
  params.require(:order).permit(:completed, :special_instructions, items_attributes: [ :size, topping_ids: [] ])
end

这是我的订单型号:

class Order < ActiveRecord::Base
  belongs_to :user
  has_many :items
  accepts_nested_attributes_for :items
end

这是我的物品型号:

class Item < ActiveRecord::Base
  belongs_to :order
  has_many :sizes
  has_many :item_toppings
  has_many :toppings, through: :item_toppings
  has_many :inverse_item_toppings, class_name: 'ItemTopping', foreign_key: 'item_id'
  has_many :inverse_toppings, through: :inverse_item_toppings, source: :item
  accepts_nested_attributes_for :sizes, reject_if: :all_blank, allow_destroy: true
end

以下是我的架构的相关部分

create_table "item_toppings", force: :cascade do |t|
  t.integer  "item_id"
  t.integer  "topping_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

create_table "items", force: :cascade do |t|
  t.string   "name"
  t.datetime "created_at",                  null: false
  t.datetime "updated_at",                  null: false
  t.string   "description"
  t.boolean  "seasonal",    default: false
  t.boolean  "active",      default: false
  t.string   "kind"
  t.integer  "toppings_id"
  t.string   "qualifier"
  t.integer  "order_id"
end

create_table "orders", force: :cascade do |t|
  t.datetime "created_at",                           null: false
  t.datetime "updated_at",                           null: false
  t.boolean  "completed",            default: false
  t.integer  "user_id"
  t.string   "special_instructions"
end

我很确定这与我的params的某些部分有关,需要是一个数组而不是哈希,但我无法根据我已经完成的类似帖子找出我的具体问题。

3 个答案:

答案 0 :(得分:5)

据我所知,因为我有一个has_many关系,我的items_attributes值需要是一个哈希数组:

{"items_attributes"=>[{"topping_ids"=>['1', '2', '5', '30']}]}

而不是

{"items_attributes"=>{"topping_ids"=>['1', '2', '5', '30']}}

我认为消息错误与Ruby期望数组索引有关 - 而不是散列键。

答案 1 :(得分:0)

猜测:

@order = Order.new(order_params)

到:

order_params_hash = order_params 

order_params_hash[:order][:item_attributes][:topping_ids].map! do |topping_id| 
  topping_id.to_i 
end

@order = Order.new(order_params_hash)

答案 2 :(得分:0)

我认为这是因为您将一个字符串数组传递给topping_ids,并且相应的数据库列设置为存储整数。

您可以调用to_i将字符串数组显式转换为整数,或者传递整数数组。