Search code examples
ruby-on-railsrubyrubygemsransack

Rails 5 ransack gem, syntax error, unexpected end-of-input


maybe after all day non-stop coding I'm blind, but I cant seem to find any errors, missing end's or mistypes.

I'm trying to use ransack search gem in rails 5. My code looks like this:

ApplicationController:

class ApplicationController < ActionController::Base
  before_filter :site_search

  def site_search
    @search = Post.ransack(params[:q])
    @search_posts = @search.result(distinct: true)
  end
end

PostsController:

class PostsController < ApplicationController
    def index
        @search = Post.ransack(params[:q])
        @posts = @search.result(distinct: true)
    end
end

Form looks like this:

<div id="search">
   <%= search_form_for @search do |f| %>
       <%= f.search_field :title_or_body_cont, placeholder: 'Type to search' %>
       <%= f.submit  %>
   <% end %>
</div>

Error looks like this:

/.../myapp/app/controllers/posts_controller.rb:6: syntax error, unexpected end-of-input, expecting keyword_end

Extracted source (around line #6):              
4       @posts = @search.result(distinct: true)
5   end
6 end * Red line here, problem with this line i guess *

Request

Parameters:

{"utf8"=>"✓", "q"=>{"title_or_body_cont"=>"e"}, "commit"=>"Search"}

Crash occurs when I click search button. There is something wrong with site_search method, because when its in controller, then all other Post classes methods crash too ( with same error ), but if I remove site_search method, then all the other methods runs fine.


Solution

  • This is occurring because at the end of line 5 of your posts controller, you had, before the line break, Unicode character 65279, ZERO WIDTH NO-BREAK SPACE. This character was directly adjacent to the d in end. I can't speak to the exact decisions the interpreter makes about handling unusual whitespace characters in different versions of Ruby, but at a guess I suspect it was interpreting your end* (with * representing the invisible character) as a four-letter identifier that would be interpreted down the road as a variable name or method call, rather than the three-letter keyword end.