2017-12-31 134 views
1

Artikel über den Controller in Rails erstellen. Eine einfache Methode, die mehr oder weniger funktioniert; nur die Methode von einem anderen Ort anrufen und es erzeugt einen neuen Artikel über das Backend und füllt die Werte:Rails: Warum kann ich ein einzelnes Datensatzattribut über Controller zu neuen Datensatz, aber nicht Array senden?

def test_create_briefing 
    a = Article.new 
    a.type_id = 27 
    a.status = 'published' 
    a.headline = 'This is a headline' 
    a.lede = 'Our article is about some interesting topic.' 
    a.body = test_article_text 
    a.save! 
end 

Wenn test_article_text nur ein einzelner Datensatz ist, das funktioniert gut und druckt den bestehenden Artikel Körper in die neuer Artikelkörper. Sieht gut aus in der Ansicht und sieht richtig aus in "Bearbeiten". Alles perfekt.

def test_article_text 
    a = Article.find_by_id(181) 
    a.body 
end 

Aber wenn ich versuche, das gleiche mit den letzten zehn Artikel zu tun, funktioniert es nicht:

def test_article_text 
    Article.lastten.each do |a| 
    a.body 
    end 
end 

In der Ansicht erhalten Sie:

[#, #, #, #, #, #, #, #, #, #] 

Und in "bearbeiten" Sie erhalten:

[#<Article id: 357, headline: "This is a headline", lede: "Our article is about some interesting topic.", body: "[#<Article id: 356, headline: \"This is a headline\"...", created_at: "2017-12-31 20:40:16", updated_at: "2017-12-31 20:40:16", type_id: 27, urgency: nil, main: nil, status: "published", caption: nil, source: nil, video: nil, summary: nil, summary_slug: nil, topstory: false, email_to: nil, notification_slug: nil, notification_message: nil, short_lede: nil, short_headline: nil, is_free: nil, briefing_point: nil>, #<Article id: 356, headline: "This is a headline"…etc, etc, etc. 

Was mache ich nicht? t wissen? Was vermisse ich?

Antwort

0

So @Shiko fast richtig war, auf jeden Fall auf dem richtigen Weg. Hatte das Array ein wenig zu manipulieren, und zwei Dinge tun, um es zu arbeiten:

  1. .join die Bits des Arrays alle den Müll Streifen aus;

  2. Verketten Sie die verschiedenen Bits für jeden Artikel auf eine andere Weise als normalerweise in einer Ansicht. So to_s für jedes der Attribute, Verkettung Dinge "" + "" und Wiederaufbau der URL mit Informationen im Array verfügbar (keine link_to, etc.).

  3. Die "**" ist Markdown, weil ich das benutze, aber ich nehme an, Sie könnten HTML-Tags dort hineinstopfen, wenn Sie müssen.

Dies funktioniert:

def test_article_text 
    arr = Array.new 
    Article.lastten.each do |a| 
    arr << "**" + a.headline.to_s + "**: " + a.text.to_s + "[Read now](/articles/#{a.id}-#{a.created_at.strftime("%y%m%d%H%M%S")}-#{a.headline.parameterize})" 
    end 
    arr.join("\n\n") 
end 
0

Es wird wie folgt zurückgegeben, da die Article.lastten die zurückgegebene Variable von Ihrem Controller ist.

[#<Article id: 357, headline: "This is a headline", lede: "Our article is about some interesting topic.", body: "[#<Article id: 356, headline: \"This is a headline\"...", created_at: "2017-12-31 20:40:16", updated_at: "2017-12-31 20:40:16", type_id: 27, urgency: nil, main: nil, status: "published", caption: nil, source: nil, video: nil, summary: nil, summary_slug: nil, topstory: false, email_to: nil, notification_slug: nil, notification_message: nil, short_lede: nil, short_headline: nil, is_free: nil, briefing_point: nil>, #<Article id: 356, headline: "This is a headline"…etc, etc, etc. 

Um alle Artikel Körper zurückzukehren, gehen Sie wie folgt:

def test_article_text 
    arr = Array.new 
    Article.lastten.each do |a| 
    arr << a.body 
    end 
    arr # should be added so it will be the last value returned from your controller 
end 
+0

Um die Menschen nach unten stimmen, bitte eine Erklärung hinzufügen, was falsch ist, damit wir alle profitieren können. – Shiko

+0

Dank @Shiko, das hat mich auf den richtigen Weg gebracht. Nahm ein bisschen mehr zwicken aber. Sehen Sie sich die Antwort an. –

Verwandte Themen