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_methodmodule 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)