コントローラの中で、ビューの image_tag 等で表示される画像の URL を取得したい時があります。

そんな時は view_context が使えます。

環境

Rails
3.0.7
Ruby
1.9.2-p180
Paperclip
2.3.11

コントローラの中でビューの image_tag に渡すパスを取得したい時があります。

例えば、Paperclip を使って画像を管理しているときに、外部サービスに Paperclip の画像の URL を渡したい時などです。

Paperclip を使って画像を管理していると、url メソッドで取得できる URL に、コントローラの中では ActionController の AssetHost の設定が付与されません。

そんな時は、view_context を使うと、ビューのコンテキストで評価してくれるので、ActionController の AssetHost の設定もきくようになります。

コントローラの例

1
2
3
4
5
6
7
8
9
10
11
12
#-*- encoding: utf-8 -*-

class CallbackController < ApplicationController
  def send
    user = User.new
    user.avatar = params[:user][:avatar]
    user.avatar.url
      # => "/users/avatars/4/original_me.jpg"
    view_context.image_path(user.avatar.url)
      # => "http://image.serverhost/users/avatars/4/original_me.jpg"
  end
end

models/user.rb

1
2
3
class User < ActiveRecord::Base
  has_attached_file :avatar
end

application.rb

1
2
3
4
5
6
7
8
9
10
require File.expand_path('../boot', __FILE__)
require 'rails/all'
Bundler.require(:default, Rails.env) if defined?(Bundler)

module MyApp
  class Application < Rails::Application
    config.action_controller.asset_host = "http://image.serverhost"
    ...()...
  end
end