如何使ActionController :: Base.asset_host和Base.relative_url_root独立?

时间:2010-05-28 18:23:47

标签: ruby-on-rails

在我们的Intranet环境中,我们有一项法令,即应该从Apache root提供公共资产(样式表,图像等),而Rails应用程序从“子目录”(代理到Mongrel集群)运行。换句话说:

<%= stylesheet_tag '/common' %> 
# <link href="http://1.1.1.1/stylesheets/common.css" />

<%= link_to 'Home', :controller=>'home', :action=>'index' %> 
# <a href="http://1.1.1.1/myapp/" />

我想要做的是在我的配置中定义资产和相对网址,如下所示:

ActionController::Base.asset_host=http://1.1.1.1
ActionController::Base.relative_url_root=/myapp

但是当我这样做时,relative_url_root值会附加到asset_host值。 (例如<link href="http://1.1.1.1/myapp/stylesheets/common.css">)有没有办法阻止这个?而且,更重要的是,是否有关于如何将rails应用程序部署到这样的环境的最佳实践?

(顺便说一句,我不想​​简单地对我的资产路径进行硬编码,因为开发环境与测试和生产环境不匹配。)

环境:
Rails 2.3.4
Ruby 1.8.7
RedHat Linux 5.4?

1 个答案:

答案 0 :(得分:2)

使用您自己的实现覆盖ActionView :: Helpers :: AssetTagHelper#compute_public_path私有方法。 或做一个像

一样的笑话
module ActionView::Helpers::AssetTagHelper
    def compute_public_path_with_root_removed *args
        compute_public_path_without_root_removed(*args).sub(
            ActionController::Base.relative_url_root,
            ""
        )
    end
    alias_method_chain :compute_public_path, :root_removed
end

您还可以根据开发/生产环境或任何其他方式使此覆盖成为条件