1台のサーバー内に非公開のRailsアプリケーションと公開用のRailsアプリケーションを置いたときに、非公開のRails側にある画像を公開側のRailsで受け取る方法についてのメモです。
要約
非公開Rails側のポイント
- ローカルIP ( 127.0.1.1:3000 など )でサーバーを立ち上げる。
- send_dataで画像データを送信する。
- (今回は画像がDBに格納されている場合の例です)
公開Rails側のポイント
- Open-uriなどで非公開Railsから画像データを取得する。
- 取得した画像はsend_dataでブラウザへ送信する。
Step1. 非公開RailsサーバーをローカルIPで立ち上げる
127.0.1.1:3000
で立ち上げます。
$ rails s -b 127.0.1.1
Step2. 非公開Railsから画像データを送信する
http://127.0.1.1:3000/image/:id
にアクセスがあったときに:id
に一致する画像をsend_data
で返すようにします。
ルーティングは次のようになります。
get 'image/:id', to: 'コントローラ#image'
コントローラは次のようになります。
画像をDBに格納するImage
モデルがあったとして、:id
に一致する画像が見つかったらsend_data
で画像を返して、見つからないときは404 Not Found
を返してます。
def image images = Image.where(:id => params[:id].to_s) unless images.empty? send_data( images[0].data, :type => 'image/jpeg', :disposition => 'inline' ) else head :not_found end end
次の記事も参考にしてください。Rails 画像をダウンロードしてDBに格納する方法
Step3. 公開Rails側で画像を取得して表示する
ブラウザから公開Railsへhttp://公開ドメイン/image/:id
としてアクセスがあったときに、非公開Railsから画像を取得して、send_data
でブラウザに送るようにします。
ルーティングは次のようになります。
get 'image/:id', to: 'コントローラ#image'
コントローラは次のようになります。
非公開RailsのローカルIP 127.0.1.1:3000
から画像を取得して、send_data
でブラウザに送っています。
def image data = open("http://127.0.1.1:3000/image/#{params[:id]}") send_data data.read, type: 'image/jpeg', disposition: 'inline' end
ビューは次のようになります。
image_tag のパスに http://公開ドメイン/image/:id
を指定するだけです。
<%= image_tag( "/image/#{id}" ) %>
次のように拡張子を付加しても動作します。
<%= image_tag( "/image/#{id}.jpg" ) %>