2015-08-13 50 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