2010-09-07 51 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