我想在我的Rails应用程序中存储一个图像,分发它的直接URL并捕获它的请求。
我创建了一个控制器/操作images_controller#show
,一个只有yield
的布局文件和一个只有image_tag
的视图文件。
呈现的图像直接链接:https://example.com/assets/a-3883fc3a19a59c2cac8e30c827e81ec6f67538dd0213393d08a425bc800a06a3.jpg
如果他们没有通过控制器,我将如何捕获此图像的请求?我的服务器日志只显示
开始GET" /assets/a-3883fc3a19a59c2cac8e30c827e81ec6f67538dd0213393d08a425bc800a06a3.jpg"
答案 0 :(得分:2)
因为"静态"资产被放置在Web服务器的Web根目录中,而无需Rails干预生产。
在开发中config.serve_static_assets = true
用于获取rails以服务资产,以便按需编译。然而,这在生产中会非常缓慢。
这里有两个基本的替代方案,使用哪个取决于您的用例:
这主要适用于上传图片是开发人员关注的问题,并且您需要出于技术或营销原因的指标。
NGinx和Apache都可以生成URI上唯一访问次数的指标。具体如何做到这一点取决于您的Web服务器/ sass提供商和其他基础设施。
如果您决定沿着这条路走下去,我建议您使用设置的详细信息开始一个新问题。
如果您打算让用户上传您想要跟踪的图像或任何形式的访问控制,您可以让用户将图像上传到非公共目录,并通过磨轨控制器运行它们。
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