2015-08-13 42 views
0

令人沮丧的是,我找不到适合我的问题的合适解决方案。动态路由Rails 4,取自db

在我的Rails 4应用程序中,我想让我的用户有可能将自己的自定义帖子类型添加到他们的网站。如:

www.example.com/houses/address-1 
www.example2.com/sports/baseball 

两者都可以使用,但仅适用于链接的网站。体育和房屋将是从用户添加的数据库中获取的(RESTful)帖子类型。

我一直在努力寻找一个优雅的解决方案来实现这一点。我发现http://codeconnoisseur.org/ramblings/creating-dynamic-routes-at-runtime-in-rails-4,但感觉有点hacky,我不知道如果重新加载路线在生产中的作品,我得到的信号,它不会。

我想说我必须使用路线约束http://guides.rubyonrails.org/routing.html#advanced-constraints但我没有线索如何处理这个。

为了清楚起见,我对网站设置没有任何问题,我的应用的多租户部分功能齐全(在中间件中设置,因此当前网站可以在routes.rb文件中调用)。我的问题是(相对)路线,以及如何用db记录动态设置它们。

任何指针非常赞赏。

+0

您是否将多个域指向一个应用程序? – sjagr

+0

是的。这是一个多租户应用程序,租户(网站)基于输入的域名。帖子类型将链接到租户(site_id字段)。 –

回答

2

我觉得路由约束不适合你,因为你的域是一个变量。相反,您应该检查request对象。

在你ApplicationController,你可以定义一个将采取任何行动之前被调用方法,像这样:

class ApplicationController < ActionController::Base 
    before_action :identify_site 

    def identify_site 
    @site = Site.where(:domain => request.host).first 
    end 
end 

当你扩展,你可以使用Redis的为您的站点,所以你赚不到昂贵的每个请求上的SQL调用。

然后,您可以将@site作为参数添加到您所做的任何调用中。我假设你正在做某种形式的“邮报”的事情,所以我会写一些样板代码:

class PostController < ApplicationController 

    def show 
    @post = Post.where(:site => @site, :type => params[:type], :id => params[:id]) 
    end 

end 

只写像任何其他常规能源的途径。

+0

我对网站设置没有任何问题,我已经完成了所有这些。猜猜我可能已经更清楚了。不过,我不知道您对“域名”标题的编辑是否正确。这不是我的意思。不过,我想你的解决方案仍然有效,但是我必须在每次请求时检查控制器操作中的帖子类型,无论输入的类型是否存在于此站点等等。我会说这可以在路线上完成,因此我提到了限制。尽管感谢您的回答,也许我应该按照您的建议角度工作。如果我找到解决方案,我会把它放在这里。 –

+0

@KobusPost你应该发布一些代码,特别是你当前的路线,也许相关的煮沸控制器方法,所以你的问题更清晰。 – sjagr