2013-07-20 53 views
0

我使用的是sitemap_generator(https://github.com/kjvarga/sitemap_generator)gem,似乎我的代碼在開發環境中工作正常,但是當我嘗試在生產環境中運行它時,出現以下錯誤:私有方法`split'調用nil:NilClass

private method `split' called for nil:NilClass 

這隻發生在生產環境(包括我的機器和我的生產服務器上),一切正常運行。這裏是我的駐留在配置/ sitemap.rb網站地圖代碼:

SitemapGenerator::Sitemap.default_host = "https://www.mysite.com" 
SitemapGenerator::Sitemap.create do 
    # The root path '/' and sitemap index file are added automatically for you. 
    # Links are added to the Sitemap in the order they are specified. 

    add '/classifieds', :changefreq => 'yearly', :priority => 0.75, :lastmod => '2013-01-01' 
    add '/sell_modified_cars', :changefreq => 'yearly', :priority => 0.75, :lastmod => '2013-01-01' 
    add '/sell_race_cars', :changefreq => 'yearly', :priority => 0.75, :lastmod => '2013-01-01' 

    add '/motorsport_event/organizations', :changefreq => 'monthly', :priority => 0.8, :lastmod => Organization.last.created_at 

    Organization.find_each do |org| 
    add motorsport_event_organization_path(org), :changefreq => 'daily', :priority => 0.9, :lastmod => Time.now 
    end 

    Event.find_each do |event| 
    add motorsport_event_organization_event_path(event.organization, event), :changefreq => 'daily', :priority => 1, :lastmod => event.event_date 
    end 

    Listing.active.each do |listing| 
    add classifieds_listing_path(listing), :changefreq => 'daily', :priority => 1, :lastmod => listing.updated_at 
    end 

    add '/faq', :changefreq => 'monthly', :priority => 0.5, :lastmod => '2013-07-01' 
    add '/how_it_works_for_buyers', :changefreq => 'yearly', :priority => 0.5, :lastmod => '2013-01-01' 
    add '/how_it_works_for_sellers', :changefreq => 'yearly', :priority => 0.5, :lastmod => '2013-01-01' 
    add '/buyer_faq', :changefreq => 'yearly', :priority => 0.5, :lastmod => '2013-01-01' 
    add '/seller_faq', :changefreq => 'yearly', :priority => 0.5, :lastmod => '2013-01-01' 
    add '/search', :changefreq => 'yearly', :priority => 0.5, :lastmod => '2013-01-01' 


    ############ 
    # PARTNERS # 
    ############ 

    add '/', :changefreq => 'monthly', :priority => 0.9, :lastmod => '2013-07-01', :host => 'https://partners.mysite.com' 
    add '/blogs', :changefreq => 'monthly', :priority => 0.8, :lastmod => Blog.last.created_at, :host => 'https://partners.mysite.com' 

    Blog.find_each do |blog| 
    add partners_blog_path(blog), :priority => 1, :lastmod => Blog.last.created_at, :host => 'https://partners.mysite.com' 
    end 

    add '/pricing', :changefreq => 'monthly', :priority => 0.8, :lastmod => '2013-07-01', :host => 'https://partners.mysite.com' 
    add '/faq', :changefreq => 'monthly', :priority => 0.5, :lastmod => '2013-07-01', :host => 'https://partners.mysite.com' 
    add '/whoweare', :changefreq => 'yearly', :priority => 0.5, :lastmod => '2012-01-01', :host => 'https://partners.mysite.com' 
    add '/workwithus', :changefreq => 'monthly', :priority => 0.5, :lastmod => '2012-01-01', :host => 'https://partners.mysite.com' 
    add '/contactus', :priority => 0.5, :lastmod => '2012-01-01', :host => 'https://partners.mysite.com' 

end 

當我運行在生產環境中的rake任務,我得到上面提到的錯誤。這裏是整個堆棧跟蹤:

rake sitemap:refresh --trace 

** Invoke sitemap:refresh (first_time) 
** Invoke sitemap:create (first_time) 
** Invoke sitemap:require_environment (first_time) 
** Execute sitemap:require_environment 
** Invoke environment (first_time) 
** Execute environment 
** Execute sitemap:create 

rake aborted! 
private method `split' called for nil:NilClass 
/shared/bundled_gems/ruby/1.8/gems/subdomain-fu-0.5.4/lib/subdomain-fu.rb:65:in `host_without_subdomain' 
/shared/bundled_gems/ruby/1.8/gems/subdomain-fu-0.5.4/lib/subdomain-fu.rb:85:in `change_subdomain_of_host' 
/shared/bundled_gems/ruby/1.8/gems/subdomain-fu-0.5.4/lib/subdomain-fu.rb:72:in `rewrite_host_for_subdomains' 
/shared/bundled_gems/ruby/1.8/gems/subdomain-fu-0.5.4/lib/subdomain_fu/url_rewriter.rb:6:in `url_for' 
(eval):17:in `motorsport_event_organization_path' 
/releases/20130720225723/config/sitemap.rb:13:in `run' 
/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.16/lib/active_record/batches.rb:26:in `find_each' 
/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.16/lib/active_record/batches.rb:26:in `each' 
/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.16/lib/active_record/batches.rb:26:in `find_each' 
/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.16/lib/active_record/batches.rb:66:in `find_in_batches' 
/shared/bundled_gems/ruby/1.8/gems/activerecord-2.3.16/lib/active_record/batches.rb:25:in `find_each' 
/releases/20130720225723/config/sitemap.rb:12:in `run' 
/shared/bundled_gems/ruby/1.8/gems/sitemap_generator-4.1.1/lib/sitemap_generator/interpreter.rb:59:in `instance_eval' 
/shared/bundled_gems/ruby/1.8/gems/sitemap_generator-4.1.1/lib/sitemap_generator/interpreter.rb:59:in `eval' 
/shared/bundled_gems/ruby/1.8/gems/sitemap_generator-4.1.1/lib/sitemap_generator/link_set.rb:39:in `create' 
/shared/bundled_gems/ruby/1.8/gems/sitemap_generator-4.1.1/lib/sitemap_generator.rb:33:in `send' 
/shared/bundled_gems/ruby/1.8/gems/sitemap_generator-4.1.1/lib/sitemap_generator.rb:33:in `method_missing' 
/releases/20130720225723/config/sitemap.rb:2:in `run' 
/shared/bundled_gems/ruby/1.8/gems/sitemap_generator-4.1.1/lib/sitemap_generator/tasks.rb:51 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `call' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:636:in `execute' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `each' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:631:in `execute' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain' 
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:607:in `invoke_prerequisites' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:604:in `each' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:604:in `invoke_prerequisites' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:596:in `invoke_with_call_chain' 
/usr/lib/ruby/1.8/monitor.rb:242:in `synchronize' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `each' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2001:in `run' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/lib/rake.rb:1998:in `run' 
/shared/bundled_gems/ruby/1.8/gems/rake-0.8.7/bin/rake:31 
/shared/bundled_gems/ruby/1.8/bin/rake:19: 

我找不到任何的生產和開發,將導致此不同。任何幫助,你可以提供將不勝感激!

編輯:我應該補充說,這似乎是生成路徑錯誤。刪除所有的路徑使這個工作正常。問題是路徑是正確的,這段代碼在開發中運行良好。我不知道爲什麼路徑不會在生產中產生。

編輯2:這裏是development.rb:

require 'rack/ssl-enforcer' 
require 'stripe' 

config.middleware.use ::Rack::SslEnforcer, :except => /^\/api\// 

# Settings specified here will take precedence over those in config/environment.rb 

# In the development environment your application's code is reloaded on 
# every request. This slows down response time but is perfect for development 
# since you don't have to restart the webserver when you make code changes. 
config.cache_classes = false 

# Log error messages when you accidentally call methods on nil. 
config.whiny_nils = true 

# Show full error reports and disable caching 
config.action_controller.consider_all_requests_local = true 
config.action_view.debug_rjs       = true 
config.action_controller.perform_caching    = false 

# Don't care if the mailer can't send 
config.action_mailer.raise_delivery_errors = false 

config.after_initialize do 
    ActionMailer::Base.delivery_method = :amazon_ses 
    ActionMailer::Base.custom_amazon_ses_mailer = AWS::SES::Base.new(:secret_access_key => S3_CONFIG[:secret_access_key], :access_key_id => S3_CONFIG[:access_key_id]) 
end 

# Default APP Domain 
APP_DOMAIN = 'mysite.dev' 
ActionMailer::Base.default_url_options[:host] = APP_DOMAIN 

# ensure the sessions work across the subdomains 
begin 
    config.action_controller.session[:domain] = ".#{APP_DOMAIN}" 
rescue 
    config.action_controller.session = {:domain => ".#{APP_DOMAIN}"} 
end 

這裏的production.rb:

# Settings specified here will take precedence over those in config/environment.rb 
require 'rack/ssl-enforcer' 
require 'stripe' 

config.middleware.use ::Rack::SslEnforcer, :except => /^\/api\// 

# The production environment is meant for finished, "live" apps. 
# Code is not reloaded between requests 
config.cache_classes = true 

# Full error reports are disabled and caching is turned on 
config.action_controller.consider_all_requests_local = false 
config.action_controller.perform_caching    = true 
config.action_view.cache_template_loading   = true 

# See everything in the log (default is :info) 
# config.log_level = :debug 

# Use a different logger for distributed setups 
# config.logger = SyslogLogger.new 

# Use a different cache store in production 
# config.cache_store = :mem_cache_store 

# Enable serving of images, stylesheets, and javascripts from an asset server 
# config.action_controller.asset_host = "http://assets.example.com" 

# Disable delivery errors, bad email addresses will be ignored 
config.action_mailer.raise_delivery_errors = false 

# Enable threaded mode 
# config.threadsafe! 

# Default APP Domain 
APP_DOMAIN = 'mysite.com' 
ActionMailer::Base.default_url_options[:host] = "www.#{APP_DOMAIN}" 

# Amazon SES Mailer 
config.after_initialize do 
    ActionMailer::Base.delivery_method = :amazon_ses 
    ActionMailer::Base.custom_amazon_ses_mailer = AWS::SES::Base.new(:secret_access_key => S3_CONFIG[:secret_access_key], :access_key_id => S3_CONFIG[:access_key_id]) 
end 

# ensure the sessions work across the subdomains 
begin 
    config.action_controller.session[:domain] = ".#{APP_DOMAIN}" 
rescue 
    config.action_controller.session = {:domain => ".#{APP_DOMAIN}"} 
end 

督促和開發環境上不共享一個數據庫。

+0

顯示我們development.rb和production.rb。他們也共享數據庫嗎? –

+0

更新了帖子。 –

+0

不是說這是問題,但是'www.''在做什麼?順便說一下,你甚至無法在生產中運行它,對嗎? –

回答

1

這裏的問題是,由於您在請求的上下文之外運行rake任務,因此沒有可供它操作的主機。從來源:發生

異常的:https://github.com/mbleigh/subdomain-fu/blob/v0.5.4/lib/subdomain-fu.rb#L65

我們可以看到,它試圖分裂一比零主機。繼堆棧跟蹤:https://github.com/mbleigh/subdomain-fu/blob/v0.5.4/lib/subdomain_fu/url_rewriter.rb#L6

我們看到,主機傳遞是

options[:host] || default_url_options[:host] 

通常情況下,default_url_options[:host]將從請求的主機頭被填充,但因爲這是一個請求之外,沒有主機標題進行操作。你需要做的是兩種:http://guides.rubyonrails.org/action_controller_overview.html#default-url-options

  • 或者,在通:主機從你調用motorsport_event_organization_path,在此路由選項

    1. 通過在應用程序控制器覆蓋default_url_options設置默認主機。

    第一個選項可能是最簡單的。

  • -1

    如果您定義的錯誤就會消失:

    def nil.split 
        tap { warn "Stand back, splitting nil!" } 
    end 
    
    相關問題