さまざまなクライアントで使用される Sinatra アプリがあります。クライアントの会社のロゴと各クライアントのカスタム layout.erb を表示したいと考えています。
コードベースは基本的に誰にとっても同じです。必要なのは、'Public' ディレクトリと 'layout.erb' で異なるファイル セットを簡単に維持する方法と、リモート サーバーに展開するときに、特定のクライアントのファイルのみを自動的にコピーする方法だけです。
考えられる方法の 1 つは、クライアントごとにview
andpublic
ディレクトリを作成し、要求ごとに適切な:views
andオプションを設定することです。:public
get '/:client/...' do
set :views, File.dirname(__FILE__) + "/views/#{params[:client]}"
set :public, File.dirname(__FILE__) + "/public/#{params[:client]}"
# Your code
end
コメントに基づいて編集:
config
ブロック中にパブリック フォルダーを設定します。ここで、各クライアントのパブリック フォルダーに 1 つのサブフォルダーを追加します。特定のファイルにアクセスするために必要なのは、ビューを変更して/#{params[:client]}/logo.png
代わりに取得することだけです/logo.png
この問題を解決する方法を見つけました。パブリック フォルダー内のファイルへのルートを再定義することができます。実際、Sinatra は最初に「get」リクエストに対応するルートがあるかどうかをチェックし、ルートがない場合は静的コンテンツの「public」フォルダに移動します。したがって、必要なクライアント固有のファイルには、「/client/logo.gif」のような特定のパスを使用します。そのようなファイルのルートを作成し、そこにカスタム ロジックを適用しました。
get '/client/logo.gif' do
#custom logic..
redirect "#{where_client_files_are}/logo.gif"
end
以下のコードをruby/sinatraファイルに追加できます
例 : イメージを作成します。プロジェクトの下とコードの下の style および scripts ディレクトリ
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