Serve error: undefined method `post_read' for class `Jekyll::Document'

Hi all, I would appreciate any help with a problem. I’m trying to update my Jekyll site after about 5 months (and a new computer). When I try to run yekyll serve I get the following error message:

Configuration file: C:/cygwin64/home/gw/portfolio/_config.yml
jekyll 3.4.3 | Error:  undefined method `post_read' for class `Jekyll::Document'```

Things I've tried to resolve the issue:

* Installing and serving jekyll 3.3.0 (which just gave me another error; I probably did it wrong)
* Grepping in `./portfolio/` for `post_read` or `Jekyll::Document` to no avail
* Serving from rubyinstaller / Windows shell instead of cygwin, where I get the same error message as above

Some things that might be noteworthy:

* I first Jekyllified the site on  2016-07-05  and last updated it  2016-10-07 (from another computer where things seemed to work).
* my config includes these gems: `['jekyll-paginate', 'jekyll-multiple-languages']`

Any help would be greatly appreciated. I'd be happy to run any commands you think might help debug the issue.

Thanks,

Max

A link to your repo (if public) would help.
If that’s not possible, serve again with the --trace switch post the output here:

# if you have a Gemfile at the root of your project and
# "Bundler" gem installed as well.
#
bundle exec jekyll serve --trace

# if you dont have a Gemfile
#
jekyll serve --trace

The error may have come from a plugin that implemented a :post_read hook.

Thanks, ashmaroli, for the reply! When I run jekyll serve --trace, I get the following output:

Configuration file: C:/cygwin64/home/gw/portfolio/_config.yml
C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-multiple-languages-2.0.3/lib/jekyll-multiple-languages/document.rb:15:in `<class:Document>': undefined method `post_read' for class `Jekyll::Document' (NameError)
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-multiple-languages-2.0.3/lib/jekyll-multiple-languages/document.rb:3:in `<module:Jekyll>'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-multiple-languages-2.0.3/lib/jekyll-multiple-languages/document.rb:2:in `<top (required)>'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-multiple-languages-2.0.3/lib/jekyll-multiple-languages.rb:3:in `<top (required)>'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:127:in `require'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:127:in `rescue in require'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:40:in `require'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/external.rb:43:in `block in require_with_graceful_fail'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/external.rb:40:in `each'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/external.rb:40:in `require_with_graceful_fail'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/plugin_manager.rb:27:in `require_gems'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/plugin_manager.rb:19:in `conscientious_require'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/site.rb:111:in `setup'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/site.rb:33:in `initialize'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/commands/build.rb:28:in `new'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/commands/build.rb:28:in `process'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/lib/jekyll/commands/serve.rb:37:in `block (2 levels) in init_with_program'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `block in execute'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `each'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb:220:in `execute'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb:42:in `go'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb:19:in `program'
        from C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/jekyll-3.4.3/exe/jekyll:13:in `<top (required)>'
        from C:/RailsInstaller/Ruby2.3.0/bin/jekyll:22:in `load'
        from C:/RailsInstaller/Ruby2.3.0/bin/jekyll:22:in `<main>'```

So it seems to be a problem with the `jekyll-multiple-languages` gem. My problem now is that I don't know how to proceed to fix it, since I'm really rather a newbie at all this. :) I've (at least for now) changed my repo to public in case it helps: https://bitbucket.org/maxstarkenburg/portfolio/overview

Thanks for the --trace output and for the URL to your repo.
This bug results from Jekyll itself as the public method :post_read was removed in v3.3.0.

There are two ways to go about this hurdle depending on what your site’s priorities are.

Till a patch is released either by Jekyll or by the plugin author, you can either:

  • forego using the jekyll-multiple-languages plugin (or)
  • downgrade to using an older version of Jekyll.

If you decide to downgrade Jekyll, then

  • Create a Gemfile at the root of your site with the following:
        source "https://rubygems.org"
        
        # use an older version of Jekyll
        gem "jekyll", "~> 3.2.1"

        # place your plugins here
        group :jekyll_plugins do
          gem "jekyll-paginate"
          gem "jekyll-multiple-languages", "~> 2.0.3"
        end
  • Install the Bundler gem if you don’t have it already:

      gem install bundler
    
  • Then install and run your site with the older jekyll:

      # move to your project directory
      cd <your-project-folder>
    
      # install old version of Jekyll with Bundler
      bundle install
    
      # serve your site with this older version of jekyll
      bundle exec jekyll serve
    

Note: Henceforth, all jekyll commands within this project will need to have bundle exec prepended to them

    bundle exec jekyll clean
    bundle exec jekyll build

etc, etc.

If you wish to proceed with the most recent version of Jekyll and use the plugin, you can serve off a patch on my fork which I’ve sent for review at the Jekyll Repo.

Create a Gemfile like I previously instructed, but, with small change with the jekyll gem:

source "https://rubygems.org"

# use a patch present on third-party git repo
gem "jekyll", git: "https://github.com/ashmaroli/jekyll.git", branch: "resurface-methods"

# place your plugins here
group :jekyll_plugins do
  gem "jekyll-paginate"
  gem "jekyll-multiple-languages", "~> 2.0.3"
end

Note: This branch specified above will be updated as required, based on feedback received upstream, and may get deleted once the patch is publicly released.

Hi ashmaroli, thank you again for all your help! When I tried following your instructions to downgrade Jekyll, I seem to run into problems with the bundle install portion; it always fails when trying to install ffi-1.9.18. When I try to run just jekyll serve with your first Gemfiile example (well, after I add a comma between "jekyll-multiple-languages" and "~> 2.0.3", which seems to be missing? … otherwise I get other errors about whitespace and such), I get the following error:

C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.14.6/lib/bundler/runtime.rb:94:in `rescue in block (2 levels) in require': There was an error while trying to load the gem 'jekyll-multiple-languages'. (Bundler::GemRequireError) Gem Load Error is: undefined method `post_read' for class `Jekyll::Document'

When I try using your patch Gemfile, I get the following error:

C:/RailsInstaller/Ruby2.3.0/lib/ruby/gems/2.3.0/gems/bundler-1.14.6/lib/bundler/source/git/git_proxy.rb:225:in `allowed_in_path': The git source https://github.com/ashmaroli/jekyll.git is not yet checked out. Please run `bundle install` before trying to start your application (Bundler::GitError)

I tried checking that repo out and putting it in a few places, but it didn’t seem to help. But perhaps I need bundler first for either option to work, but I don’t seem to be able to get past the ffi-1.9.18 problem (no matter my attempts at trying to install earlier versions and things like that). If you’re still up for trying to help me debug this, that would be superb! I’d like to try to avoid foregoing jekyll-multiple-languages if possible. Thanks for all your help so far.

Thanks for pointing out the missing comma. I’ve updated both Gemfile examples.

Regarding the ffi-1.9.18 gem issue, its related to the DevKit package that you may have installed along with RailsInstaller for Windows. When you have the proper DevKit package installed, you’ll see the following message when trying to install ffi:

Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...

Debugging this specific issue is best suited at StackOverflow (Google will provide you links to solved tickets for similar problems)
The main points you need to take back are that Ruby and DevKit need to be of the same bit-type (either both 32-Bit or both 64-Bit, based on your CPU Architecture and Windows version), and then the DevKit may need to be setup properly. More info in this post

Hi ashmaroli,

I just wanted to say thank you for your help. I never was able to get things working in Windows/Cygwin, but I recently tried again with an Ubuntu virtual machine, and your responses were very helpful in getting things to work this time around. Thanks again!

Max

1 Like