2015-06-11 2 views
2

Я использовал Sidekiq для обработки асинхронных писем. Он хорошо работает в разработке, однако он не отображает действительный URL-адрес актива в опубликованной электронной почте.Ruby On Rails: Mailer: Sidekiq - путь к ресурсу недействителен по электронной почте: Engineyard: Nginx: Пассажир

Ожидаемый URL Asset:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png

Got:
http://myapp.com/images/logo.png

Я использую Engineyard как VPC. На рабочих/промежуточных серверах у меня есть специальный экземпляр утилиты с именем redis, который содержит redis server и sidekiq экземпляров. Они правильно обрабатывают электронную почту, поэтому я думаю, что они в хорошем состоянии.

конфигурации Nginx в /data/nginx/servers/my_app.conf
cat /data/nginx/servers/my_app.conf

server { 

    listen 81; 

    server_name _; 


    client_max_body_size 100M; 

    root /data/my_app/current/public; 

    access_log /var/log/engineyard/nginx/my_app.access.log main; 
    error_log /var/log/engineyard/nginx/my_app.error.log notice; 

    location ~ ^/(images|assets|javascripts|stylesheets)/ { 
    expires 10y; 
    try_files $uri $uri/index.html /last_assets/$uri /last_assets/$uri.html @app_my_app; 
    } 

    error_page 404 /404.html; 
    error_page 500 502 504 /500.html; 
    error_page 503 @503; 
    recursive_error_pages on; 
    location @503 { 

    error_page 405 = /system/maintenance.html; 

    if (-f $request_filename) { 
     break; 
    } 

    rewrite ^(.*)$ /system/maintenance.html break; 
    } 

    location @app_my_app { 

    passenger_enabled on; 

    passenger_set_cgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for; 
    passenger_set_cgi_param HTTP_X_REAL_IP   $remote_addr; 
    passenger_set_cgi_param HTTP_HOST    $http_host; 
    passenger_set_cgi_param HTTP_X_FORWARDED_PROTO $scheme; 
    passenger_set_cgi_param HTTP_X_REQUEST_START 't=$start_time'; 
    passenger_set_cgi_param HTTP_X_QUEUE_START  't=$start_time'; 

    passenger_set_cgi_param SERVER_PORT   80; 

    rack_env staging; 

    passenger_min_instances 2; 
    } 

    location/{ 
    if (-f $document_root/system/maintenance.html) { return 503; } 
    try_files $uri $uri/index.html $uri.html @app_my_app; 
    } 
include /etc/nginx/servers/my_app/custom.conf; 
} 

и я использовал вспомогательный метод, чтобы получить URL логотипа Организации

# Gets the logo URL of the Organization set by Controller/Mailer 
    # in instance variable @organization 
    # @param [Organization] organization default value is nil 
    # @return [String] URL for logo image 
    def get_logo_url(organization = nil) 
    if organization && organization.logo.present? 
     # This case works as AWS S3 is used 
     organization.logo_url(:logo) 
    else 
     # This case not working 
     asset_url('logo.png') 
    end 
    end 

Последнее Поиск:
Я попытался отправить по электронной почте от основное приложение без использования sidekiq и оно работает в этом случае , Помощники по активам, такие как asset_url, asset_path, image_path, не могут получить имя файла diegsted из файла манифеста.

+0

Какой прокси-сервер Http вы используете? Nginx, Apache? –

+0

@MrH Я использую веб-сервер 'Nginx' и' phusionpassenger' в качестве сервера приложений – illusionist

+0

Получение этой же проблемы с помощью Passenger на Heroku –

ответ

0

Примечание: Как темп затруднительного/Лучшее решение по-прежнему ищет

С sidekiq были сталкиваются с проблемами с обслуживанием статических активов, хранящихся в assets/images/logo.png.

Ожидаемый URL Asset:

http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png

Got:
http://myapp.com/images/logo.png

, так что я на самом деле переехал статические файлы ресурсов, которые я, возможно, потребуется в электронной почте public/images каталог. Теперь вместо Rails приложение, Nginx обслуживает активы. Теперь его работы

Мой последний вывод (сомнение): Я сомневаюсь, что мой повар поваренные книги не в состоянии начать sidekiq и соответствующий Rails экземпляр для sidekiq в production/staging среде.

0

Я - руководитель команды для моторного двора. Если бы вы могли открыть билет, мы могли бы расследовать немного больше от вашего имени.

Спасибо,

Ральф

1

я столкнулась с такой же проблемой.Проблема заключалась в том, что я не собирал активы на сервере sidekiq, поэтому там не было манифеста.

Изменение в Capistrano от: task :compile_assets, roles: :app, primary: true do

к: task :compile_assets, roles: [:app, :processor], primary: true do

установил его в моем личном деле.

+1

действительно проблема связана с предварительной компиляцией активов в sidekiq; однако я не использую 'capistrano', поэтому никакой помощи для меня. В любом случае это определенно поможет другим разработчикам; поэтому +1 с моей стороны – illusionist

+1

Спасибо - это спасло мой день! Хотя исправление довольно очевидно, я никогда не думал об этом. –