Rails 3 send_data问题;生产和发展之间的差异

时间:2011-10-23 22:03:42

标签: ruby-on-rails-3 image development-environment production-environment

我的Rails 3应用程序中有一个奇怪的错误。我使用此代码发送非公开的图像:

image = open(f, "rb") { |io| io.read }
send_data(image, :disposition => 'inline')

我正在使用此代码在管理页面和用户页面中显示图像。如果我使用开发环境,则此代码可以正常工作,并且图像将显示在两个页面上。但是,如果我使用生产环境,则此图像仅显示在管理页面中,而不显示在用户页面中。我可以单击未显示的图像,然后选择“属性”。在图像类型下,我看到:

application/xhtml+xml

但是其他公共图像的类型是JPG图像/ PNG图像或类似的东西。

environemnts之间的区别可能导致图像不起作用以及如何解决这个问题,所以图像将在所有页面上正确显示?

1 个答案:

答案 0 :(得分:0)

我有一个明显相似的症状。我知道这是一个老问题,已经解决但我认为我会提供我的情况调查结果,结果证明是另一个原因。

我正在构建一个CSV文件并使用send_file将文件发送到浏览器。在开发过程中它运行良好,在生产中浏览器报告找不到页面。

以下是来自控制器的动作。

def export
  @campaign = LiveEmailCampaign.find params[:id]
  @campaign.recipients_csv do |csv_file|
    send_file csv_file,
      filename: @campaign.name,
      type: Mime::CSV 
  end 
end

CSV是在模型中根据此代码构建的。

def recipients_csv
  tempfile = Tempfile.new(self.name.downcase.dasherize)
  CSV.open tempfile, 'w' do |csv|
    recipients.each do |recipient|
      csv << [recipient]
    end
  end
  yield tempfile
end

经过几分钟的研究后,我确定罪魁祸首是生产服务器上Apache中的XSendFile指令与用于写入CSV数据的临时路径之间的冲突。在我的情况下,XSendFile仅设置为应用程序根目录,临时文件位于服务器上的/ tmp中。

我没有在服务器级别篡改XSendFile配置,而是指示Tempfile使用Rails应用程序中的tmp文件夹。

因此,我将模型方法中对Tempfile的调用更改为此

tempfile = Tempfile.new(self.name.downcase.dasherize)

现在,Rails和Apache又是朋友。我只需要重构此代码,因为它没有显式取消链接创建的临时文件。最佳做法是明确取消链接临时文件。