2 Stimmen

Rails - Helfer Singleton und Rails Route Helfer in einem Presenter

Ich kann nicht scheinen, um herauszufinden, warum ich einen 500-Fehler, wenn ich versuche, eine Route Helfer in meinem Presenter-Klasse verwenden

Haben Sie eine Presenter-Klasse unter /apps/presenters/base_presenter.rb /apps/presenters/object_presenter.rb

class BasePresenter

  def self.as_collection(collection)
    collection.collect{|object| self.new(object)}
  end

  def help
    Helper.instance
  end

  class Helper
    include Singleton
    include Rails.application.routes.url_helpers
    include ActionView::Helpers::TextHelper
    include ActionView::Helpers::TagHelper
    include ActionView::Helpers::UrlHelper
    include ApplicationHelper
    include UrlHelper
  end

end

so in meinem Objekt Presenter ich das folgende für eine as_json tun. Alles funktioniert, bis ich diese url hinzufügen. Verblüfft, warum es nicht auf die Rails-Routen zugreifen wird.

class ObjectPresenter < BasePresenter

  def initialize( object )
    @object = object
  end

  def as_json(*args)
    { 
        :url => blah_blah_url(@object, :subdomain => "www")
    }
  end

end

jede Hilfe wäre sehr zu schätzen, weil ich ratlos bin :)

6voto

bokor Punkte 1819

Okay, ich habe es herausgefunden.

class Presenter
  include Rails.application.routes.url_helpers

  def self.as_collection(collection)
    collection.collect{|object| self.new(object)}
  end

  def help
    Helper.instance
  end

  class Helper
    include Singleton
    include ActionView::Helpers::TextHelper
    include ActionView::Helpers::TagHelper
    include ActionView::Helpers::UrlHelper
    include ApplicationHelper
    include UrlHelper
  end

end

dann in meiner Umgebung/development.rb

  Rails.application.routes.default_url_options = { :host => "lvh.me:3000" } # Fixes issue with Presenters not allowing Routes and Url Helper
  config.action_mailer.default_url_options = { :host => "lvh.me:3000" }

und mein UrlHelper

module UrlHelper

  def with_subdomain(subdomain)
    subdomain = (subdomain || "")
    subdomain += "." unless subdomain.empty?
    host = Rails.application.routes.default_url_options[:host]
    [subdomain, host].join
  end

  def url_for(options = nil)
    if options.kind_of?(Hash) && options.has_key?(:subdomain)
      options[:host] = with_subdomain(options.delete(:subdomain))
    end
    super
  end

end

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