2010-09-07 54 views
5

我写一个规范的控制器的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 

但是当我运行它,我得到的错误"Symbol as array index"控制器,处理此代码:

params[:campaign][:adtag_attributes].each_with_index do |attributes,index| 
    # some code 
end 

任何想法? 感谢

编辑1:

我没有写控制器,但它与手动测试工作。 调用我的控制器的视图有这样的代码:

fields_for 'campaign[adtag_attributes][]', adtag do |adtag_form| 

也许我的规格不好?

编辑2:

问题解决感谢Rishav的答案。我不明白,在该视图中,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>" } 

和它的工作。

回答

5

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

你可以做这个

 
params[:campaign][:adtag_attributes].each do |key,value| 
    #some code 
end 

只是改变在测试以下

params[:campaign][:adtag_attributes] = []
params[:campaign][:adtag_attributes] << somedata

希望这个作品

+0

我没有写控制器,但它与手动测试一起工作。查看我的帖子编辑了解更多详情。 – 2010-09-08 16:05:37

+0

检查以上更新 – 2010-09-08 17:45:15

+0

是的,它的工作原理。谢谢 ! – 2010-09-08 23:26:55