Как настроить динамические переменные перед запросом? - PullRequest
0 голосов
/ 16 мая 2011

У меня есть фабрика блогов, подобная этой:

- 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), чтобы установить динамическое имя блога и динамически использовать переменную пути в маршрутах. Я думал о глобальном var, но это кажется плохой идеей ( Почему не используются глобальные переменные (знак доллара $)? ).

Как вы думаете, это хорошая идея? Как лучше всего сохранить название блога при запросе?

Ответы [ 2 ]

1 голос
/ 16 мая 2011

Вам не нужно обрабатывать это перед запросом. У вас есть два типа URL: 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, который сообщает вам, какой это блог, он также доступен в представлениях при рендеринге.

0 голосов
/ 16 мая 2011

Вы должны использовать глобальную переменную. Но будьте осторожны во время ее использования. Инициализируйте ее в общем месте, чтобы вы могли изменить ее в любое время. как

- 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...