捕获资产中图像的请求

Capture requests for image in assets

我想在我的 Rails 应用程序中存储一张图片,为它分发直接 URL 并捕获对它的请求。

我创建了一个 controller/action images_controller#show,一个只有 yield 的布局文件和一个只有一个 image_tag.

的视图文件

渲染直接link到图像:https://example.com/assets/a-3883fc3a19a59c2cac8e30c827e81ec6f67538dd0213393d08a425bc800a06a3.jpg

我将如何捕获对此图像的请求,因为它们没有通过控制器?我的服务器日志只显示

Started GET "/assets/a-3883fc3a19a59c2cac8e30c827e81ec6f67538dd0213393d08a425bc800a06a3.jpg"

由于 "static" 资产放置在网络服务器的网络根目录中,因此无需 Rails 干预生产即可提供它们。

开发中 config.serve_static_assets = true 用于获取 rails 服务资产,以便按需编译。然而,这在生产中会非常缓慢。

这里有两个基本的替代方案,使用哪个取决于您的用例:

1。在网络服务器上执行:

如果开发人员关心上传图像并且您出于技术或营销原因需要指标,这最适用。

NGinx 和 Apache 都可以生成 URI 上唯一访问次数的指标。具体如何执行此操作取决于您的 Web 服务器/sass 提供商和其他基础设施。

如果您决定走这条路,我建议您开始一个新问题,并详细说明您的设置。

2。像处理任何其他资源一样处理图像

如果您打算让用户上传您的图像并希望进行跟踪或任何形式的访问控制,您可以让用户将图像上传到非 public 目录并通过 运行磨 rails 控制器。

Gems like paperclip or carrierwave 可以让这变得更容易。

# config/routes.rb
resources :images

# app/models/image.rb
class Image < ActiveRecord::Base 
  belongs_to :user
  validates_presence_of :file
end

# app/controllers/images_controller.rb
class ImagesController < ApplicationController

  def new
    @image = Image.new
  end

  def create
    @image = Image.new(image_params)
    @image.save
    respond_with(@image)
  end

  def index
    @images = Image.all
  end

  def show
    @images = Image.find(params[:id])
    respond_to do |f|
      format.html {}
      format.jpg { send_file @image.file , type: 'image/jpeg', disposition: 'inline' }
    end
  end

  # ...

end