2009-11-24 86 views
3

我有一个Sinatra应用程序,可供不同客户端使用。我希望向客户展示客户的公司标志和自定义的layout.erb。Ruby Sinatra - 为公共文件夹中的文件添加自定义路由

每个人的代码基本相同。我需要的只是一种方法,可以在'Public'目录和'layout.erb'中轻松维护一组不同的文件,并且在部署到远程服务器时,只会自动复制特定客户端的文件。

回答

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

+0

Yoann,我没有意识到这种可能性,谢谢!我想要添加多个公用文件夹。一组文件对于所有客户都是通用的,只有少数不同。我想添加两个路线。有任何想法吗?谢谢! – Jasim 2009-11-25 21:05:29

+0

您可以设置一个通用公共文件夹,并在其中包含特定文件的一些子文件夹。而不是在每次仅基于客户端请求子文件夹中的文件时更改:public选项 – 2009-11-26 10:05:33

1

刚刚找到了解决这个问题的方法。可以重新定义路由到公用文件夹中的文件。实际上,Sinatra首先检查'get'请求是否具有相应的路由,如果不是,则它会转到'public'文件夹以获取静态内容。因此,对于我需要的任何特定于客户端的文件,我使用特定的路径,如“/client/logo.gif”种URL。我创造了这样的文件的路径和有应用我的自定义逻辑:

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

您可以在下面的代码添加到您的红宝石/西纳特拉文件

例如:创建图像。样式和脚本目录在您的项目下和代码

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 
相关问题