爲了解決我自己的問題:是的,這是可能的。
在我的情況下,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中遇到問題(非常少見),您需要多次重新加載頁面直到顯示新內容。
另一個有趣的問題是安全性。我認爲它是比較安全的。但我不是安全專家。任何擔憂?
我們僅在內部使用此平臺。沒有產品,所以我們不處理錯誤非常溫和。
請添加更多信息。一個具體的例子會很棒。有幾種解決方法。 – wintermeyer
我想知道如果Rails是這樣的矯枉過正,也許你應該考慮像Sinatra:http://www.sinatrarb.com/ –
你能澄清這個問題嗎? –