2011-11-30 75 views
1

背景:的Rails 3.1自定义控制器和视图W /默认

  • 我建立一个应用程序,允许用户创建自己的网站(例如,mywebsite.alexlod.com)
  • 每个网站的所有者附属和我在一起,所以我相信他们写自己的Rails代码
  • 每一个网站应该有默认的控制器和视图,除非这些业主的一个创建自己的

下面是我设想控制研究ers working:

我在想app/controllers/是什么在默认情况下,但是当在<subdomain>顶级目录中指定文件时,该文件将优先于默认值。

让我举个例子。假设我的一个网站所有者(foo.alexlod.com)想调整app/controllers/photos_controller.rb。他们应该能够创建foo/controllers/photos_controller.rb,从而使用他们的控制器而不是默认值。我认为这里的正确方法与路由和加载路径有关,但我是Rails和Ruby的新手,可以使用一些指导。

至于意见,我希望他们工作很多。当在<subdomain>/views/中定义视图或部分时,将使用该视图而不是位于app/views/中的缺省值。

我意识到我的计划在这里违反了默认的rails目录结构。但是这种方法比每个控制器操作中的替代案例陈述更简单。除非有更好的选择?

回答

0

我相信engines可能是你想要的东西。该链接有点旧,但仍应适用于Rails 3.1。每个子域的控制器和视图可以放置在各自的引擎文件夹中。

现在,您只需要确定每个请求加载哪个引擎即可。这是我认为可能阻碍你的想法的部分 - 你不希望在生产中一直加载和卸载代码。

在这种情况下,您可能希望选择使用模板语言Liquid。但是,这对用户来说控制的很少。

+0

谢谢,拉蒙。这个解决方案工作得很好,并且在杰夫的建议下,我也能很好地处理视图。 – alexlod

+0

@alexlod你是如何最终为每个子域(动态)加载一个引擎的?我很想看到你的解决方案。 – Jimmy

+0

@Jimmy,你不能动态加载引擎我不这么认为。所以我加载了每个引擎并添加了路由,以便在给定某个子域时使用正确的控制器。 – alexlod

0

我可能有一个部分的答案,因为它听起来像你想做一些非常类似于我为我的网站的移动版本做的事情。在确定用户是移动用户之后,我将一个移动目录添加到路径中,以覆盖任何我已针对移动优化的视图。如果该视图不存在于移动目录中,则默认为默认视图。

这里是我做了观点:

在app /控制器/ application_controller.rb

before_filter :prepend_view_path_if_subdomain 

def prepend_view_path_if_subdomain 
    unless pSubdomains.blank? 
    subdomain = request.subdomain.first 

    #This will add the subdomain view directory to the view path before the default 
    #Rails view directory and any views here will be picked up and rendered. 
    prepend_view_path 'app/' + subdomain + '/views' 
    end 
end 

在做同样的事情控制器,然而,由于路由有点麻烦。没有prepend_controller_path方法等于prepend_view_path。老实说,我不知道如何处理这个问题,你可以使用你的case语句方法,或者可能动态转发请求到子域控制器(如果存在)。我认为有可能在控制器中添加一个before_filter,它可以很好地评估每个请求,就像我上面显示的视图一样,然后确定应该使用哪个控制器。

我也偶然发现了这个问题:Rails 3.1 load controller from different path based on subdomain,不知道它是否对你有帮助。

+0

谢谢,杰夫!我遵循拉蒙的建议,看着引擎。我希望引擎能够很好地使用prepend_view_path方法。引擎处理控制器和路由,prepend_view_path将处理视图。酷:)。 – alexlod

相关问题