Rails 非公開Railsから画像を受け取る

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" ) %>