#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 снова друзья. Мне просто нужно реорганизовать этот код, потому что он явно не отсоединяет созданный временный файл. Наилучшей практикой является явное отключение временных файлов.