3

私はRails 3アプリに奇妙なバグがあります。私はこのコードを使用して、公開されていない画像を送信しています:Rails 3 send_data issue;生産と開発の違い

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

私はこのコードを使用して管理ページとユーザーページに画像を表示しています。 開発環境を使用すると、このコードは正常に動作し、画像は両方のページに表示されます。しかし、の生産環境を使用すると、このイメージは管理ページにのみ表示され、ユーザーページには表示されません。表示されていない画像をクリックして「プロパティ」を選択することができます。画像の種類]で、私は以下を参照してください。

application/xhtml+xml 

しかし、他の公共の画像は、このようなタイプのJPG画像/ PNG画像か何かの下にあります。

環境の違いによって画像が動作しなくなる可能性があります。これをどのように修正できますか?すべてのページに画像が正しく表示されますか?

+0

これらの文書を見ると、間違っているかもしれない大量の問題があります:http://apidock.com/rails/ActionController/DataStreaming/send_file –

+0

問題は、アプリケーションコード(フィルタの前)によるアクセス制限にあった可能性があります。友人は私のためにそれを修正することができました:) – nikicc

+1

他の人があなたのトラブルから学ぶことができるようにあなたの修正を答えとして加えることができます:) –

答えて

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 

そして、このコードからモデルを構築します。私は犯人が本番サーバー上のApacheでXSendFileディレクティブとする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 

。私の場合、XSendFileはアプリのルートのみに設定されていて、一時ファイルはサーバー上の/ tmpにあります。

サーバレベルでXSendFile設定を改ざんする代わりに、私はTempfileにRailsアプリでtmpフォルダを使用するように指示しました。

だから、私は今、この

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

にモデル法では一時ファイルへの呼び出しを変更し、RailsとApacheは再び友人です。作成した一時ファイルを明示的にリンク解除しないため、このコードをリファクタリングするだけです。ベストプラクティスは、一時ファイルを明示的にリンク解除することです。

関連する問題