Ruby on rails 基于用户会话使用Rails服务静态网站
是否可以基于用户登录(以用户为中心的路由)将用户路由约束从Rails 3/4发送到服务器完整的网站?我大概在考虑将不同的静态网站放在应用程序的子目录中,让用户可以在主根目录下访问它们(通过登录进行保护) 如果没有用户登录,则使用简单的登录掩码来识别用户,例如使用Desive。我在考虑简化静态页面的登台部署,例如,使用中间人生成的页面。最好有一个简单的capistrano任务来部署到rails应用程序中,而不是创建子域、ftp上载等 在/下安装静态页面的原因是,大多数静态站点生成器都希望页面在/下,我希望避免资产中的绝对/相对路径出现问题 更具体地说: 案例1)用户未登录->任何路由请求验证 案例2)用户已登录,静态内容由/app/sites/site1提供(安装在“/”) 案例3)另一个用户已登录,静态内容由/app/sites/site2提供(安装在“/”)Ruby on rails 基于用户会话使用Rails服务静态网站,ruby-on-rails,Ruby On Rails,是否可以基于用户登录(以用户为中心的路由)将用户路由约束从Rails 3/4发送到服务器完整的网站?我大概在考虑将不同的静态网站放在应用程序的子目录中,让用户可以在主根目录下访问它们(通过登录进行保护) 如果没有用户登录,则使用简单的登录掩码来识别用户,例如使用Desive。我在考虑简化静态页面的登台部署,例如,使用中间人生成的页面。最好有一个简单的capistrano任务来部署到rails应用程序中,而不是创建子域、ftp上载等 在/下安装静态页面的原因是,大多数静态站点生成器都希望页面在/下
所服务的网站取决于用户档案。回答我自己的问题:是的,这是可能的 在我的例子中,Rails并没有过度使用。我与基于Rails的项目管理系统实现了无缝集成。我正在将一个应用程序安装为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
注意:我有很多静态页面的项目。我们对平台中的每个静态页面都有一个预览操作。如果您使用平台表单中的链接点击预览操作,您将被重定向到预览子域并设置会话。我们的身份验证允许我们
- 向客户发送带有身份验证令牌(SHA slug)的匿名链接
- 并通过数据库进行身份验证
我们只在内部使用这个平台。没有产品,因此我们不会非常温和地处理错误。请添加更多信息。一个具体的例子会很好。有几种方法可以解决这个问题。我想知道Rails是不是太夸张了,也许你应该考虑一下像西纳特拉这样的问题:你能澄清这个问题吗?
# 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