2

プレゼンタークラスでルートヘルパーを利用しようとすると、なぜ500エラーが発生するのか理解できないようです。

/apps/presenters/base_presenter.rb/apps/presenters/object_presenter.rbの下にPresenterクラスがあります

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

そのため、オブジェクトプレゼンターでは、as_jsonに対して次のようにします。このURLを追加するまで、すべてが機能します。Railsルートにアクセスできない理由について困惑しました。

class ObjectPresenter < BasePresenter


  def initialize( object )
    @object = object
  end

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

end

私は困惑しているので、どんな助けでも大歓迎です:)

4

1 に答える 1

6

わかりました。

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

次に、私の環境/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" }

と私の 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
于 2012-04-30T15:34:42.557 に答える