Проблема с отправкой данных Rails 3; разница между производством и разработкой

#ruby-on-rails-3 #image #development-environment #production-environment

#ruby-on-rails-3 #изображение #среда разработки #производственная среда

Вопрос:

У меня странная ошибка в моем приложении Rails 3. Я использую этот код для отправки изображений, которые не являются общедоступными:

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

Я использую этот код для отображения изображений на страницах администратора и пользовательских страницах. Если я использую среду разработки, этот код работает нормально, и изображения отображаются на обеих страницах. Но если я использую производственную среду, эти изображения отображаются только на страницах администратора, но не на страницах пользователя. Я могу щелкнуть по изображениям, которые не отображаются, и выбрать «свойства». Под типом изображения я вижу:

 application/xhtml xml
  

Но другие общедоступные изображения имеют тип JPG image / PNG image или что-то в этом роде.

Какая разница между окружениями может привести к тому, что изображения не будут работать, и как я могу это исправить, чтобы изображения правильно отображались на всех страницах?

Комментарии:

1. Посмотрите на эти документы, в них упоминается множество вещей, которые могут пойти не так: apidock.com/rails/ActionController/DataStreaming/send_file .

2. Проблема заключалась в ограничении доступа с помощью кода приложения (до фильтров), в случае мая. Другу удалось исправить это для меня 🙂

3. Вы можете добавить свое исправление в качестве ответа, чтобы другие люди могли извлечь уроки из ваших проблем 🙂

4. В моем случае проблема заключалась в плохо написанном коде. Я использовал фильтры before, чтобы проверить, может ли пользователь видеть страницу. В этом фильтре before у меня был reditect_to, который перенаправлял запрос на главную страницу. Поэтому, когда браузер отправил запрос на изображения, он был перенаправлен на главную страницу с помощью фильтра before. Вот почему тип был HTML. Извините, что не написал раньше, но я не ответил, так как это была ошибка в моем коде, а не проблема с rails. Но все же я понятия не имею, как это могло произойти в процессе разработки ?!?!?

Ответ №1:

У меня был явно похожий симптом. Я знаю, что это старая проблема, и она уже решена, но я подумал, что хотел бы поделиться выводами о моей ситуации, которая оказалась другой причиной.

Я создавал файл 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
  

После нескольких минут исследований я определил, что причиной был конфликт между директивой XSendFile в Apache на рабочем сервере и временным путем, используемым для записи данных CSV. В моем случае XSendFile был установлен только для корня приложения, а временный файл находился в /tmp на сервере.

Вместо того, чтобы изменять конфигурацию XSendFile на уровне сервера, я просто дал указание Tempfile использовать папку tmp в приложении Rails.

Итак, я изменил вызов Tempfile в методе модели на это

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

Теперь Rails и Apache снова друзья. Мне просто нужно реорганизовать этот код, потому что он явно не отсоединяет созданный временный файл. Наилучшей практикой является явное отключение временных файлов.