5 Stimmen

Ruby-Fehler: "Symbol als Array-Index"

Ich schreibe gerade eine Spezifikation für die create Verfahren eines Controllers :

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

Aber wenn ich es ausführe, erhalte ich den Fehler "Symbol as array index" im Controller, wenn er versucht, diesen Code zu verarbeiten:

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

Irgendeine Idee? Danke

EDIT 1:

Ich habe den Controller nicht geschrieben, aber er funktioniert mit manuellen Tests. Die Ansicht, die meinen Controller aufruft, hat diesen Code:

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

Vielleicht ist meine Spezifikation nicht gut?

EDIT 2:

Problem dank der Antwort von Rishav gelöst. Ich habe das in der Ansicht nicht verstanden, campaign[adtag_attributes][] bedeutet, dass campaign[adtag_attributes] ist ein Array.

Ich habe also einfach die

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

von

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

und es hat geklappt.

5voto

Rishav Rastogi Punkte 15487

Params[:campaign][:adtag_attributes] ist ein Hash und kein Array. Wenn also die Methode "each_with_index" auf dem Hash ausgeführt wird, sieht es das Symbol ":code" als Index und gibt diesen Fehler aus.

Sie können dies einfach tun

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

im Test einfach wie folgt ändern

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

hoffentlich funktioniert das

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X