bok*_*kor 2 singleton ruby-on-rails presenter ruby-on-rails-3
我似乎无法弄清楚为什么我在Presenter类中尝试使用路径助手时会出现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
Run Code Online (Sandbox Code Playgroud)
所以在我的对象演示者中,我为as_json执行以下操作.在添加此网址之前,每件事情都有效.令人难以置信为什么它不会访问Rails路由.
class ObjectPresenter < BasePresenter
def initialize( object )
@object = object
end
def as_json(*args)
{
:url => blah_blah_url(@object, :subdomain => "www")
}
end
end
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激,因为我很难过:)
好吧我明白了.
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
Run Code Online (Sandbox Code Playgroud)
然后在我的环境/ 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" }
Run Code Online (Sandbox Code Playgroud)
和我的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
Run Code Online (Sandbox Code Playgroud)