2015-08-23 8 views
8

Ich habe eine Web-App, in der ich auch eine ziemlich komplexe Art von Blog habe. Für diesen Blog benutze ich sowohl RedCarpet als Markup-Sprache als auch eine hausgemachte Markup-Sprache, das ist sehr nützlich.Rails: Render Inhalt in Post-Prozessor (Modell/Helfer Ausgaben)

In meiner hausgemachten Markup-Sprache rufe ich Produktansichten und andere Teiltöne aus der App. Ich verwende das in zwei verschiedenen Modellen: BlogPost und Artikel.

@blog_post.unprocessed_content = "Today I would like to show you this **cool** product that we offer: [[PRODUCT#ID:123]]." 

Die [[PRODUCT # ID: 123]]

Zum Beispiel könnte eine Blog-Post so etwas wie meine eigene Markup-Sprache und kühlen ist RedCarpet. Ich benutze eine render_content Methode aus ApplicationHelper wie folgt aus:

processed_content = render_content(@blog_post.unprocessed_content) 

die würden Ausgangs

processed_content = "Today I would like to show you a <strong>cool</strong> product that we offer: <h3>Apple</h3><img src="apple.jpg"><p>Apple is a nice fruit.</p>. Price: 1 USD." 

Der "apple" Teil geholt wird aus einer eine View-Teil.

Das Verfahren in ApplicationHelper verwendet zum Beispiel: - machen partials/blog_post/product_item_with_pic - RedCarpet Markup

Ich schreibe alle Artikel/Blog-Posts in einem Markup/unverarbeitetem Zustand, aber es wäre total Sinn pre machen -process dieser Inhalt, wenn ich veröffentliche und render_content() auf :before_save geladen haben.

Das Problem

Grundsätzlich würde, Ich mag diese verwenden: BEFORE_SAVE aus dem Blogpost und Artikel Modell aber dann laufe ich in das Thema Helfer Sachen zu versuchen, aus einem Modell zu tun, und es ist alles chaotisch bekommt .

Ich habe versucht, zu verwenden:

ApplicationController.helpers.render_content(@blog_post.unprocessed_content) 

aber dann kann es nicht die Sicht-partials wie/blog_post/product_item_with_pic finden. Es fühlt sich an, als würde ich einfach weiter auf solche Probleme stoßen.

Im Moment habe ich eine sehr hässliche Lösung (das funktioniert) und es ist die Vorverarbeitung in der Ansicht, wenn die Ansicht geladen ist. Grundsätzlich, in admin :: blog_post # show rufe ich render_content auf und führe dann einen Speichervorgang durch. Ja, es ist hässlich.

Meine Fragen

  1. Was die eleganteste Art und Weise zu lösen sein würde?
  2. Wenn es zumindest nicht wirklich einen guten Weg gibt, wie kann ich auf Teiltöne zugreifen, wenn ich den ApplicationHelper so aus dem Modell herausrufe?
+0

Es ist nicht ganz klar, was Ihr 'render_content' tatsächlich tut. – EugZol

+0

Sie haben absolut Recht, es war nicht sehr klar. Ich habe es jetzt bearbeitet. – Christoffer

Antwort

2

Ich bin mir nicht sicher, ob ich vollständig verstehe, was Sie wollen. Um die Rails-View-Rendering-Funktionen außerhalb des Standardflusses zu verwenden, sollte man jedoch render_anywhere gem.

require 'render_anywhere' 

class Article < ActiveRecord::Base 
    include RenderAnywhere 
    class RenderingController < RenderAnywhere::RenderingController; end 

    before_save :process_content 
    attr_reader :content 

    private 

    def process_content 
    # This variable will contain resulting HTML 
    @content = render(template: 'articles/article', layout: 'articles') 
    end 
end 

die brief documentation für Informationen, wie innerhalb des Renderers Helfer zur Verfügung zu stellen.

+0

Ja, ich habe meine Frage noch einmal durchgelesen und es war nicht sehr klar. Ich habe es behoben, deine Lösung tridiert und mit einigen Verbesserungen an meinen eigenen Funktionen hat es funktioniert. Vielen Dank! – Christoffer