捕获资产中的图像请求

时间:2016-04-20 11:00:27

标签: ruby-on-rails ruby-on-rails-5

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

我创建了一个控制器/操作images_controller#show,一个只有yield的布局文件和一个只有image_tag的视图文件。

呈现的图像直接链接:https://example.com/assets/a-3883fc3a19a59c2cac8e30c827e81ec6f67538dd0213393d08a425bc800a06a3.jpg

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

  

开始GET" /assets/a-3883fc3a19a59c2cac8e30c827e81ec6f67538dd0213393d08a425bc800a06a3.jpg"

1 个答案:

答案 0 :(得分:2)

因为"静态"资产被放置在Web服务器的Web根目录中,而无需Rails干预生产。

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

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

1。在Web服务器上执行此操作:

这主要适用于上传图片是开发人员关注的问题,并且您需要出于技术或营销原因的指标。

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

如果您决定沿着这条路走下去,我建议您使用设置的详细信息开始一个新问题。

2。将图像处理为任何其他资源

如果您打算让用户上传您想要跟踪的图像或任何形式的访问控制,您可以让用户将图像上传到非公共目录,并通过磨轨控制器运行它们。

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