2015-07-28 38 views
5

Próbuję wywołać image_url (z modułu ActionView::Helpers::AssetUrlHelper) z poziomu kontrolera. Mój kontroler jest kontrolerem API, który renderuje odpowiedź json. Tak więc kontroler przygotowuje obiekt i używam jBuilder do renderowania rzeczywistej odpowiedzi JSON. Oto kod:Jak mogę użyć pomocnika Rails image_url na warstwie Controller, aby zwracała poprawną wartość?

class Api::Mobile::HomeController < Api::Mobile::ApplicationController 
    include ActionView::Helpers::AssetUrlHelper 

    def index 
    @items = [Api::Mobile::HomePageItem.new(
       type: 'image', 
       image: image_url("api/mobile/home/tutor-with-student.jpg"))] 
    end 
end 

Obraz tutor-with-student.jpg istnieje w następującym folderze:

app/assets/images/api/mobile/home/tutor-with-student.jpg 

Problemem jest to, że image_url zwraca wartość:

http://myhost.com/images/api/mobile/home/tutor-with-student.jpg 

zamiast

http://myhost.com/assets/api/mobile/home/tutor-with-student.jpg 

Należy zauważyć, że gdy używam image_url z rzeczywistego widoku, metoda zwraca poprawną wartość.

Jak mogę użyć metody image_url na warstwie kontrolera, aby zwracała poprawną wartość?

Odpowiedz

10

Należy użyć:

ActionController::Base.helpers.asset_url("api/mobile/home/tutor-with-student.jpg", type: :image) 

i usunąć włączenie modułu actionView :: Pomocnicy :: AssetUrlHelper

Ponadto, upewnij się, że masz ustawić wartość action_controller.asset_host w pliku konfiguracyjnym środowiska . Tak więc, na środowisku produkcyjnym powinno być w config/environments/production.rb i musi być jak

config.action_controller.asset_host='myhost.com' 
0

Dzięki poprzedniego autora. Nie jestem pewien co do wydajności, ale ta metoda pomogła mi:

def logo_url 
    host_url = request.path == '/' ? request.url : request.original_url.split(request.path).first 
    asset_path = ActionController::Base.helpers.asset_url('logo.png') 
    host_url + asset_path 
end 
# will return 
=> "http://localhost:3000/assets/logo-40e3bf1e10f0c00393ac94f96ea127986955c166eb839266eb2ad6e63b42754c.png"`