RubyonRails:Mailer:Sidekiq-资产路径在email:Engineyard:Nginx:Passenger中无效

RubyonRails:Mailer:Sidekiq-资产路径在email:Engineyard:Nginx:Passenger中无效,nginx,passenger,actionmailer,sidekiq,engineyard,Nginx,Passenger,Actionmailer,Sidekiq,Engineyard,我使用了Sidekiq异步处理电子邮件。它在developmentenv中运行良好,但是它不能在发布的电子邮件中呈现有效的资产URL 预期资产URL: http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png 得到: http://myapp.com/images/logo.png 我正在使用Engineyard作为专有网络。在生产/暂存服务器中,我有一个名为redis的专用实用程序实例,它由运行的redis服务器和sid

我使用了
Sidekiq
异步处理电子邮件。它在developmentenv中运行良好,但是它不能在发布的电子邮件中呈现有效的资产URL

预期资产URL:
http://myapp.com/assets/logo-277121cb27cd5798ea5786fa2996c82f.png

得到:
http://myapp.com/images/logo.png

我正在使用
Engineyard
作为专有网络。在生产/暂存服务器中,我有一个名为
redis
的专用实用程序实例,它由运行的
redis服务器
sidekiq
实例组成。他们正在正确处理电子邮件,所以我猜他们的状况良好

/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\u url
asset\u path
image\u path
之类的资产帮助程序无法从清单文件中获取已分发的文件名

注:作为临时解决方案/最佳解决方案,仍在寻求

自从
sidekiq
以来,一直面临着为存储为
assets/images/logo.png
的静态资产提供服务的问题

预期资产URL:

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

得到:
http://myapp.com/images/logo.png

因此,我实际上将电子邮件中可能需要的静态资产文件移动到了
public/images
目录。现在,不再使用
Rails
app,
Nginx
为资产提供服务。 现在它开始工作了

我的最新发现(怀疑):我怀疑我的厨师烹饪书无法在
生产环境中启动
sidekiq
和相应的
Rails
实例


我是发动机厂的队长。如果你能开一张罚单,我们可以代表你做更多的调查

谢谢


拉尔夫

我也面临着同样的问题。问题是我没有在sidekiq服务器上编译资产,所以那里没有清单

Capistrano的变化来自:

任务:编译_资产,角色::应用程序,主:true do

致:

任务:编译_资产,角色:[:app,:processor],主:true do


在我的个人案例中修复了它。

如果有人正在使用capistrano 3,那么他需要包括sidekiq角色(或部署sidekiq的服务器角色)。。。。否则,capistrano仅为web角色编译资产

server 'testanywebsite.com', user: 'deploy-user', roles: %w(sidekiq)
set :assets_roles, [:web, :sidekiq]

您在哪个Http代理上运行?Nginx,Apache?@MrH我使用
Nginx
webserver和
phusionpassenger
作为应用服务器在Herokual上使用Passenger获得相同的问题也看到了这个问题。投票赞成一个解决方案!好的,也让它成为最受欢迎的更新索引问题与sidekiq中的资产预编译有关;但是我没有使用capistrano,因此没有任何帮助。无论如何,这肯定会帮助其他开发者;所以我身边的+1谢谢-这救了我一天!尽管解决办法很明显,但我从未想过这一点。