我有一个可供不同客户使用的 Sinatra 应用程序。我希望为每个客户显示客户的公司徽标和自定义 layout.erb。
每个人的代码库基本相同。我所需要的只是一种在“Public”目录和“layout.erb”中轻松维护不同文件集的方法,并且在部署到远程服务器时,仅自动复制特定客户端的文件。
一种可能的方法是为每个客户端设置一个目录,view
并为每个请求public
设置适当的:views
和选项:public
get '/:client/...' do
set :views, File.dirname(__FILE__) + "/views/#{params[:client]}"
set :public, File.dirname(__FILE__) + "/public/#{params[:client]}"
# Your code
end
根据评论编辑:
config
在阻止期间设置您的公用文件夹。现在为每个客户端添加一个子文件夹到您的公用文件夹。访问特定文件所需要做的就是修改视图以获取/#{params[:client]}/logo.png
而不是/logo.png
刚刚找到了解决这个问题的方法。可以重新定义公用文件夹中文件的路由。事实上,Sinatra 首先检查“get”请求是否有对应的路由,如果没有,它会转到“public”文件夹获取静态内容。因此,对于我需要的任何特定于客户端的文件,我使用特定路径,例如“/client/logo.gif”类型的 URL。我为这些文件创建了一个路由,并在那里应用了我的自定义逻辑:
get '/client/logo.gif' do
#custom logic..
redirect "#{where_client_files_are}/logo.gif"
end
您可以将以下代码添加到您的ruby/sinatra文件中
示例:创建图像。项目下的样式和脚本目录以及代码下方
get '/project1/images/:file' do
send_file('/home/sulo/dev/project1/images/'+params[:file], :disposition => 'inline')
end
get '/project1/style/:file' do
send_file('/home/sulo/dev/project1/style/'+params[:file], :disposition => 'inline')
end
get '/project1/scripts/:file' do
send_file('/home/sulo/dev/project1/scripts/'+params[:file], :disposition => 'inline')
end