2013-06-19 66 views
0

基於用戶登錄(以用戶爲中心的路由),用戶是否可以將Rails 3/4的約束條件限制到服務器完整的網站?我大致考慮將不同的靜態網站放在應用程序的子導向器中,並讓它們可以在主根目錄(通過登錄保護)下訪問。根據用戶會話爲使用Rails的靜態網站提供服務

如果沒有用戶登錄,則使用簡單的登錄掩碼來標識用戶,例如,與設計。我正在考慮簡化靜態頁面的分段部署,例如由中間人產生。將一個簡單的capistrano任務部署到rails應用程序中將會好得多,而不是創建子域,ftp上傳等。

將靜態頁面安裝到/下的原因是,大多數靜態網站生成器都希望頁面在/下,我想避免資產中絕對/相對路徑的問題。

更具體地:

情況1)用戶沒有登錄在 - >的任何途徑請求AUTH

情況2)用戶已登錄,靜態內容從/服務應用程序/站點/站點1(安裝在 「/」)

情況3)另一個用戶已登錄,靜態內容從/應用/網站/站點2(安裝在 「/」)

送達

與網站投放取決於用戶的個人資料。

+0

請添加更多信息。一個具體的例子會很棒。有幾種解決方法。 – wintermeyer

+0

我想知道如果Rails是這樣的矯枉過正,也許你應該考慮像Sinatra:http://www.sinatrarb.com/ –

+0

你能澄清這個問題嗎? –

回答

0

爲了解決我自己的問題:是的,這是可能的。

在我的情況下,Rails沒有矯枉過正。我與我們基於Rails的項目管理系統進行了無縫集成。我正在安裝Sinatra -App作爲Web服務器,使用基於用戶會話的不同公共URL。會話通過唯一標記生成,以便用戶可以一個接一個查看不同的靜態項目。

的routes.rb:

constraints(:subdomain => /preview/) do 
    mount SinatraWrapper => "/" 
end 

注:我使用的約束在這裏,檢查子域。每個靜態預覽都會重定向到同一個應用程序,位於不同的子域下。

西納特拉包裝:

# a super-trivial Sinatra-based webserver 
# for static content 
require 'sinatra/base' 

class SinatraWrapper < Sinatra::Base 
    before '/*' do 
    SinatraWrapper.set_site(session[:site]) 
    end 

    def self.set_site(site) 
    rootPath = File.expand_path("#{Rails.root}/sites/#{site}/") 
    set :public_folder, "#{rootPath}/current/build/" 
    end 

    configure do 
    set :static, true 
    set :static_cache_control, [:public, :no_store, :no_cache, :must_revalidate, :max_age => 0, :expires => "Fri, 01 Jan 1990 00:00:00 GMT"] 
    end 

    set_site("default") 

    # route to starting page (index.html) 
    get "/" do 
    redirect "/index.html" 
    end 

    # route to custom error page (404.html) 
    not_found do 
    redirect "/404.html" 
    end 

end 

注:我通過Capistrano的部署,從靜態的項目更新到正確的Rails應用程序。構建通過Middleman(我們可能在這裏使用任何其他靜態站點生成器)遠程執行。另一個實例檢查我們的git存儲庫中的「預覽」 - 分支更新並在其上運行測試。通過所有測試後,構建將自動執行並部署。

這裏是有點棘手,使用兩個不同的子域不同的行爲,但同一個會話:

# static_pages_controller.rb: 

def preview 

    if request.subdomain == "preview" or Rails.env.development? # local dev: no subdomains 
     @static_page = StaticPage.find(params[:id]) 
     session[:site] = @static_page.slug || "default" # using a sha-slug for every static project 
     redirect_to "/" # redirect to root. we have a valid session now. 
    else 
     # we are NOT on the preview subdomain, so we need to redirect to proper subdomain 
     @project = Project.find(params[:project_id]) 
     @static_page = StaticPage.find(params[:id]) 
     redirect_to preview_url(project_id: @project.id, id: @static_page.id, token: @static_page.slug).sub("plattform", "preview") 
    end 
end 

注:我有很多很多的靜態頁面的項目。我們爲plattform的每個靜態頁面提供預覽操作。如果您使用plattform中的鏈接點擊預覽操作,則會重定向到預覽子域,並設置會話。我們的認證使我們能夠與認證令牌(SHA-蛞蝓)給客戶

    • 發送匿名聯繫,並通過數據庫進行驗證

    我們現在使用這個系統了一年半,是非常滿意!客戶可以馬上看到預覽。直到現在,我們還沒有遇到任何嚴重的問題,除了必須正確設置緩存頭以確保每次重新加載頁面時加載新內容。這會減慢體驗,但我們始終可以爭辯說,這是預覽。說實話,大多數客戶不認識加載時間。

    無論如何,我不是100%確定,如果我的實施「崩潰」緩存是完美的解決方案。任何提示將非常感激。我只在Chrome和Safari中遇到問題(非常少見),您需要多次重新加載頁面直到顯示新內容。

    另一個有趣的問題是安全性。我認爲它是比較安全的。但我不是安全專家。任何擔憂?

    我們僅在內部使用此平臺。沒有產品,所以我們不處理錯誤非常溫和。

  • 相關問題