Ruby Sinatra - 为公用文件夹中的文件添加自定义路由

时间:2009-11-24 04:54:26

标签: ruby ssh sinatra scp

我有一个Sinatra应用程序,可供不同客户使用。我希望为每个客户展示客户的公司徽标和自定义layout.erb。

代码库对每个人来说基本相同。我只需要一种在“公共”目录和“layout.erb”中轻松维护不同文件集的方法,并在部署到远程服务器时自动复制特定客户端的文件。

3 个答案:

答案 0 :(得分:3)

一种可能的方法是为每个客户端设置一个viewpublic目录,并为每个请求设置正确的: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

答案 1 :(得分:1)

刚刚找到解决这个问题的方法。可以将路由重新定义到公用文件夹中的文件。事实上,Sinatra首先检查“获取”请求是否具有相应的路由,如果没有,则进入“公共”文件夹以获取静态内容。因此,对于我需要的任何特定于客户端的文件,我使用类似'/client/logo.gif'类型的URL的特定路径。我为这些文件创建了一个路径并在那里应用了我的自定义逻辑:

get '/client/logo.gif' do
  #custom logic..
  redirect "#{where_client_files_are}/logo.gif"
end

答案 2 :(得分:0)

您可以将以下代码添加到 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