web-dev-qa-db-fra.com

Rails 3: Comment obtenir le chemin de l'image dans Controller?

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?

22
Misha Moroshko
ActionController::Base.helpers.asset_path('missing_file.jpg')

Accès au chemin d'accès aux ressources depuis le contrôleur Rails

55
deefour

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.

21
Matt Huggins

view_context.image_path('noimage.jpg')

7
Ricardo Rivas

URL de l'actif:

ActionController::Base.helpers.asset_path(my_path)

URL de l'image:

ActionController::Base.helpers.image_path(my_path)
4
ilgam

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
0
Devin