2013-08-06 13 views
5

Używam Rabl generować wyjście XML w zadaniu natarcia:Rabl.render: jak korzystać z metod pomocniczych widoku?

xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
# do stuff with xml 

Jednak muszę korzystać z wielu metod pomocnik w pliku widoku Rabl odwołanie, a ja wciąż dostaję NoMethodError jak oczekiwałem od odpowiedź na this question.

Próbowałem za pomocą extends i include w klasie używanej przez zadanie natarcia, ale nadal ten sam błąd w sprawie metod pomocniczych:

require "#{Rails.root}/app/helpers/feeds_helper.rb" 

class SerializeData 
    extends FeedsHelper 

    def perform 
    xml = Rabl.render @listings, 'feeds/listings', :format => :xml 
    # do stuff with xml 
    end 
end 

Moje pytanie brzmi: czy jest jakiś sposób, aby użyć metody pomocnika w rabl wyświetla pliki wygenerowane w ten sposób? (lub przynajmniej w taki sposób, że nadal mogę renderować je jako ciąg w zadaniu rake?) Metody pomocnicze są używane wiele, wiele razy, aby poprawnie formatować różne dane na ustalone wymagania, więc byłoby bardzo trudno je całkowicie usunąć .

Odpowiedz

5

Skończyło się na rozwiązaniu małpiej.

Zauważyłem, że błąd NoMethodFound pochodził z instancji klasy Rabl::Engine, więc zawarte potrzebnych metod routingu i pomocnik w tej klasie i był wówczas w stanie do nich dostęp:

require "#{Rails.root}/app/helpers/feeds_helper.rb" 
... 
class Rabl::Engine 
    include Rails.application.routes.url_helpers 
    include FeedsHelper 
end 

Należy również pamiętać, że hosta URL musi być ustawiony w przypadku korzystania url oprócz path pomocników (np root_url i root_path):

Rails.application.routes.default_url_options[:host] = "www.example.com" 

zdecydowanie preferują nie- małpi-łatka lub co najmniej jeden, w którym pomocnicy mogliby zostać uwzględnieni w razie potrzeby w zależności od kontrolera podjętej akcji. Będę czekać, aby zaakceptować to, aby sprawdzić, czy ktoś może wymyślić taką odpowiedź.

4

Można przekazać obiekt zakresu za pomocą parametru scope. Więc jeśli masz dostęp do obiektu z pomocnikiem w cenie, jak wtedy, gdy w kontekście widoku, a następnie można przejść że np

<%= Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: self).html_safe%> 

tak poza kontekstem widok, którą trzeba przejść w zwyczaju obiekt z pomocnikami dołączonymi do tego celu. np

class RakeScope 
    include FeedHelper 
end 

Rabl::Renderer.json(object_to_render, 'api/v1/object/show', view_path: 'app/views', scope: RakeScope.new()) 

ja nie próbowałem drugą opcję, ale pierwszy działa świetnie.

0

Chociaż nie do końca ten sam problem, miałem podobny problem, uzyskując pomocników ze specyfikacji RSpec. Stworzyłem funkcję pomocniczą, która tworzy zakres, którego można użyć do dodania pomocników, których potrzebujesz. Następujące dały mi dostęp do ścieżek i metod pomocnika adresów URL, a coś podobnego powinno działać dla Rake.

#spec/support/rabl_helper.rb 
def render_rabl(object, options={}) 
    options = { 
    format: 'json', 
    view_path: 'app/views', 
    file:  example.example_group.top_level_description, 
    scope:  RablScope.new 
    }.merge(options) 

    result = Rabl.render(object, options.delete(:file), options) 
    options[:format] == 'json' ? JSON.parse(result) : result 
end 

class RablScope 
    include Rails.application.routes.url_helpers 
end 
Powiązane problemy