我正在为 Controller 的create方法编写规范:

describe "POST create" do

    it "should create an adtag with valid params" do
      campaign = Campaign.make

      campaign_attributes = Hash.new
      campaign_attributes[:adtag_attributes] = Hash.new
      campaign_attributes[:adtag_attributes][:code] = "<h1>Sample code</h1>"

      post 'create', { :id => campaign.id, :campaign => campaign_attributes }
    end

end

但是当我运行它时,当它尝试处理此代码时,我在 Controller 中收到错误"Symbol as array index":
params[:campaign][:adtag_attributes].each_with_index do |attributes,index|
  # some code
end

任何想法 ?
谢谢

编辑1:

我还没有编写 Controller ,但是它可以进行手动测试。
调用我的 Controller 的 View 具有以下代码:
fields_for 'campaign[adtag_attributes][]', adtag do |adtag_form|

也许我的规范不好?

编辑2:

由于Rishav的回答,问题得以解决。我不了解该 View 中的campaign[adtag_attributes][]表示campaign[adtag_attributes]是一个数组。

所以我才换了
campaign_attributes = Hash.new
campaign_attributes[:adtag_attributes] = Hash.new
campaign_attributes[:adtag_attributes][:code] = "<h1>Sample code</h1>"

经过
campaign_attributes = Hash.new
campaign_attributes[:adtag_attributes] = Array.new
campaign_attributes[:adtag_attributes] << { :code => "<h1>Sample code</h1>" }

并解决了。

最佳答案

params [:campaign] [:adtag_attributes]是一个哈希,而不是一个数组,因此在哈希上运行“each_with_index”方法时,它将“:code”符号视为索引并抛出该错误。

你可以做到这一点

params [:campaign] [:adtag_attributes]。每个| key,value |
#一些代码
结尾

只是在测试中更改为关注
params[:campaign][:adtag_attributes] = []
params[:campaign][:adtag_attributes] << somedata

希望这有效

关于ruby-on-rails - Ruby错误: "Symbol as array index",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3663500/

10-09 15:51