如何在请求之前设置动态变量?

时间:2011-05-16 11:06:20

标签: ruby-on-rails ruby ruby-on-rails-3 routes cross-domain

我有一个像这样的博客工厂的配置:

- blogcrea.com/a-blog/ -> blog = a-blog
- blogcrea.com/another-blog/ -> blog = another-blog
- blogcrea.com/blog-with-custom-domain/ -> blog = blog-with-custom-domain

但我也想使用这样的完全域名:

- www.myawsomeblog.com -> blog = blog-with-custom-domain

我主持了很多博客,而且还有很多域名,所以我无法对每个案例进行处理。

我在考虑使用before_dispatch(http://m.onkey.org/dispatcher-callbacks)来设置动态博客名称,并在routes.rb中动态使用路径变量。我在考虑一个全局var,但这似乎是一个坏主意(Why aren't global (dollar-sign $) variables used?)。

你认为这是个好主意吗?在请求期间存储博客名称的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您无需在请求之前处理它。您有两种类型的网址:blogcrea.com/[blogname]/[other params][customdomain]/[other params]

处理此问题的最佳方法是使用两组路由,具体取决于域:

constrains(CheckIfBlogCrea) do
    match '/:blog(/:controller(/:action(/:id)))' # Build your routes with the :blog param
end

match '/(:controller(/:action(/:id)))' # Catch the custom domain routes

共同域的匹配器:

module CheckIfBlogCrea

    def self.matches?(request)
        request.host == 'blogcrea.com' 
    end

end

现在您知道路线将始终匹配。当然,您仍然需要知道要显示哪个博客。这可以使用ApplicationController

before_filter轻松完成
class ApplicationController < ActionController::Base

    before_filter :load_blog


    protected

    def load_blog
        # Custom domain?
        if params[:blog].nil?
            @blog = Blog.find_by_domain(request.host)
        else
            @blog = Blog.find_by_slug(params[:blog])
        end
        # I recommend to handle the case of no blog found here
    end

end

现在,在您的操作中,您将拥有@blog对象,告诉您它是哪个博客,渲染时也可以在视图中使用。

答案 1 :(得分:-1)

你应该使用全局变量。但是在使用它时要小心。用普通的地方初始化它,这样你就可以随时改变它。喜欢

- blogcrea.com/a-blog/ -> blog = $a-blog
- blogcrea.com/another-blog/ -> blog = $another-blog
- blogcrea.com/blog-with-custom-domain/ -> blog = $blog-with-custom-domain