Pour obtenir le chemin de l'image dans Controller, j'utilise la méthode suivante:
class AssetsController < ApplicationController
def download(image_file_name)
path = Rails.root.join("public", "images", image_file_name).to_s
send_file(path, ...)
end
end
Existe-t-il une meilleure méthode pour trouver le chemin?
ActionController::Base.helpers.asset_path('missing_file.jpg')
Accès au chemin d'accès aux ressources depuis le contrôleur Rails
Je ne sais pas si cela a été ajouté dès Rails 3, mais cela fonctionne définitivement dans Rails 3.1. Vous pouvez maintenant accéder au view_context
à partir de votre contrôleur, ce qui vous permet d'appeler des méthodes normalement accessibles pour vos vues:
class AssetsController < ApplicationController
def download(image_file_name)
path = view_context.image_path(image_file_name)
# ... use path here ...
end
end
Notez que cela vous donnera le chemin accessible au public (par exemple: "/assets/foobar.gif"), pas le chemin du système de fichiers local.
view_context.image_path('noimage.jpg')
URL de l'actif:
ActionController::Base.helpers.asset_path(my_path)
URL de l'image:
ActionController::Base.helpers.image_path(my_path)
view_context
fonctionne pour moi dans Rails 4.2 et Rails 5.
Trouvez des codes dans le référentiel Rails explique view_context
:
# definition
module ActionView
# ...
module Rendering
# ...
def view_context
view_context_class.new(view_renderer, view_assigns, self)
end
end
end
# called in controller module
module ActionController
# ...
module Helpers
# Provides a proxy to access helper methods from outside the view.
def helpers
@_helper_proxy ||= view_context
end
end
end