我有一个像这样的博客工厂的配置:
- 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?)。
你认为这是个好主意吗?在请求期间存储博客名称的最佳方法是什么?
答案 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