简体   繁体   中英

private method `split' called for nil:NilClass

I'm using the sitemap_generator ( https://github.com/kjvarga/sitemap_generator ) gem and seem to have my code working fine in the development environment but when I try to run it in production I get the following error:

private method `split' called for nil:NilClass

This only happens in the production environment (both on my machine and my production server), everything runs fine in development. Here's my site map code which resides in config/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

When I run the rake task in the production environment I get the error noted above. Here's the whole stack trace:

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:

I can't find anything different between production and development that would cause this. Any help you could provide would be appreciated!

EDIT: I should probably add that this seems to be something wrong with generating the paths. Removing all of the paths makes this work fine. The problem is that the paths are correct and this code runs fine in development. I don't know why the paths don't generate in production.

EDIT 2: Here's 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

Here's 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

The prod and dev environments do not share a DB.

The issue here is that since you're running the rake task outside of the context of a request, there is no host for it to operate on. From the source:

The exception occurs at: https://github.com/mbleigh/subdomain-fu/blob/v0.5.4/lib/subdomain-fu.rb#L65

We can see that it's trying to split a nil host. Following the stack trace to: https://github.com/mbleigh/subdomain-fu/blob/v0.5.4/lib/subdomain_fu/url_rewriter.rb#L6

We see that the host being passed in is

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

Normally, default_url_options[:host] would be populated from the request's Host header, but since this is outside of a request, there's no host header to operate on. What you need to do is either:

  1. Set a default host via overriding default_url_options in your application controller: http://guides.rubyonrails.org/action_controller_overview.html#default-url-options
  2. Or, pass in :host to the route options from where you're calling motorsport_event_organization_path .

The first option is probably the easiest.

The error will go away if you define:

def nil.split
  tap { warn "Stand back, splitting nil!" }
end

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM