This is more tricky than it should be because url_for, asset_path, etc. all rely on different mechanisms.
Anyway, you can use the attached trait like this:
class ExampleController < ApplicationController
does 'host_enforcement', :for => 'some_action'
end
Short explanation:
-
asset_hostis used for links to stylesheets and javascripts -
asset_hostbelongs toActionController::Base-- changes are persistent and will not be reset after a request -
rewrite_optionsis used by the..._pathmethods in the views
^
module HostEnforcementTraitInclude this method in a module because we cannot yield out of define_method
module InstanceMethods
private# Force URLs for JavaScript and Stylesheet links def assets_have_urls old_asset_host = asset_host self.asset_host = HOST yield ensure self.asset_host = old_asset_host endend
as_trait do |*args|
include HostEnforcementTrait::InstanceMethodsoptions = args.first || {} methods = options[:for] around_filter :assets_have_urls, :only => methods private # Force URLs for link_to etc define_method :rewrite_options do |*args_options| options = args_options.first || {} enforce = methods.nil? || Array(methods).collect(&:to_s).include?(action_name) super(enforce ? options.merge(:only_path => false) : options) endend
end
You need modularity Show archive.org snapshot for traits.
Posted by Arne Hartherz to makandra dev (2010-08-24 17:28)