Deploying to Heroku, elasticsearch problems.

I've deployed my app to Heroku however whenever I try to search for a
professor or even view an individual professor (without searching) I
just get "We're sorry, but something went wrong."

Running heroku logs returns:

Rendered layouts/_header.html.erb (0.7ms)
2016-06-19T00:10:42.316086+00:00 app[web.1]: Completed 200 OK in 35ms
(Views: 32.3ms | ActiveRecord: 0.9ms)
2016-06-19T00:10:46.924567+00:00 heroku[router]: at=info method=GET
path="/professors/search?utf8=%E2%9C%93&search=test"
host=professor-ratings.herokuapp.com
request_id=a69a87dd-7730-4bbb-a903-e1be1d2d5635 fwd="198.84.185.123"
dyno=web.1 connect=1ms service=14ms status=500 bytes=1754
2016-06-19T00:10:46.927525+00:00 app[web.1]:
2016-06-19T00:10:46.926535+00:00 app[web.1]: Completed 500 Internal
Server Error in 6ms (ActiveRecord: 0.0ms)
2016-06-19T00:10:46.918438+00:00 app[web.1]: Started GET
"/professors/search?utf8=%E2%9C%93&search=test" for 198.84.185.123 at
2016-06-19 00:10:46 +0000
2016-06-19T00:10:46.927533+00:00 app[web.1]:
app/controllers/professors_controller.rb:35:in `search'
2016-06-19T00:10:46.920628+00:00 app[web.1]: Parameters: {"utf8"=>"✓",
"search"=>"test"}
2016-06-19T00:10:46.927533+00:00 app[web.1]: Faraday::ConnectionFailed
(Connection refused - connect(2) for "localhost" port 9200):
2016-06-19T00:10:46.927534+00:00 app[web.1]:
2016-06-19T00:10:46.920585+00:00 app[web.1]: Processing by
ProfessorsController#search as HTML
2016-06-19T00:10:46.927534+00:00 app[web.1]:

I've seen a similar issue discussed on Stack Overflow and someone said
that elastic search may not be running. But if I run curl
localhost:9200 there is a hash so I believe it's running and I don't
think that's the problem.

Any help would be greatly appreciated I'm very lost this is my first app
I'm building mostly to teach myself rails so I've never deployed
anything before.

If you cannot even view an record then there it is something more than
a search problem. What does the log show when you just try to view?
Always fix the simplest problem first.

Colin

Wait, what?? "localhost" from your development system is not the
same as "localhost" from a Heroku-deployed application.

You need to sign up for a Heroku ElasticSearch add-on or run your
own ES instance somewhere; in either case, the access URL will
certainly not be for "localhost" :slight_smile:

To address the two responses: thank you, I took Colin's suggestion and
ran a log just trying to access a record:

2016-06-20T23:57:59.062266+00:00 app[web.1]: Completed 500 Internal
Server Error in 10ms (ActiveRecord: 3.5ms)
2016-06-20T23:57:59.061980+00:00 app[web.1]: Rendered
professors/show.html.erb within layouts/application (2.5ms)
2016-06-20T23:57:59.064210+00:00 app[web.1]: ActionView::Template::Error
(undefined method `fullname' for #<Professor:0x007fdd5ef001e8>):
2016-06-20T23:57:59.064216+00:00 app[web.1]: 20: <li>
<strong>Average Review: </strong><div class="star-rating" data-score=
<%= @avg_review %> </div></li>
2016-06-20T23:57:59.064217+00:00 app[web.1]:
2016-06-20T23:57:59.064214+00:00 app[web.1]: 18: <ul
class="list-unstyled">
2016-06-20T23:57:59.064212+00:00 app[web.1]: 15:
2016-06-20T23:57:59.064214+00:00 app[web.1]: 17: <h1
class="review_title"> <%= @professor.fullname %> </h1>

It seems to be having a problem with showing the name, I don't know why
this is a problem this page works fine on localhost. One possible thing
I can think of is that I created a column "firstname" in a recent
migration (still well before I pushed this to Heroku) could it be
possible that Postgres is using an earlier migration then SQLite?

This is my show.hm.erb where the offending method is:

  <div class="col-md-6">
          <h1 class="review_title"> <%= @professor.fullname %> </h1>
          <ul class="list-unstyled">
            <% if !@review.blank? %>
            <li> <strong>Average Review: </strong><div
class="star-rating" data-score= <%= @avg_review %> </div></li>
            <% end %>

            <li><strong>School: </strong><%= @professor.school %></li>
            <li><strong>Department: </strong> <%= @professor.department
%></li>
            <li><%= "#{@review.length}" "
Review".pluralize(@review.length)%></li>
          </ul>
      </div>

Have a look at the database itself and see. I don't know how to do
that on Heroku but I am sure google will tell you if not some
documentation on Heroku.

However I note that the error is referring to fullname but you say you
added a column firstname so perhaps that is the issue.

Colin

So the problem displaying the record was indeed because Heroku was on an
older migration of the DB. So after migrating to the changed column
names I can access records.

Elasticsearch still eludes me I've been going through this resource:
https://docs.bonsai.io/docs/ruby-on-rails trying to get bonsai to work I
get to the last step "Index your documents" but I'm not sure what to put
for "curl -XPUT
http://username:password@redwood-12345.us-east-1.bonsai.io/users" is it
just my Heroku username, password and app? Sorry I just can't find a lot
of resources to help me deploy Searchkick via Elasticsearch anywhere.

1) presumably it's your bonsai account information, but

2) per the referenced page that's *not* the "last step" but only an
    alternative to the preferred setting up of rake tasks.

   What problem(s) are you having with the rake task approach?

When ever I try to rake it aborts:

Starting up a new ElasticSearch client with
rake aborted!
NameError: uninitialized constant Elasticsearch::Model

Elasticsearch is running or at least it seems to be and I did everything
they said in the Bonsi documentation.

? That uninitialized constant error has nothing to do with whether or
not "Elasticsearch is running".

Also, bonsai.io is a service providing an Elasticsearch instance for
you to connect to; whether you have an instance running locally is
not relevant.

Is this project repo public? Or can you create one to demonstrate
the problem?

Actually, do you have these two entries in your Gemfile?

gem 'elasticsearch-rails'
gem 'elasticsearch-model'

If not, add them and run `bundle install`

Hey sorry I have been busy and up until your post I did not have a
public repo however now I do:

https://github.com/tfantina/ratings

I've tried to clean it up nicely (when it was private it was a little
untidy and still is). I have those gems installed but whenever I try to
load the app in Heroku it crashes:
Exiting
2016-06-30T06:51:44.294061+00:00 app[web.1]:
/app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:in
`require': No such file to load -- easticsearch/model (LoadError)

and now whenever I view the app in localhost it also crashes:

Started GET "/professors" for ::1 at 2016-06-30 06:01:07 -0400
Processing by ProfessorsController#index as HTML
Completed 500 Internal Server Error in 3ms (ActiveRecord: 0.0ms)

LoadError (cannot load such file -- easticsearch/model):

Thanks again for your help.

Hey sorry I have been busy and up until your post I did not have a
public repo however now I do:

https://github.com/tfantina/ratings

I've tried to clean it up nicely (when it was private it was a little
untidy and still is). I have those gems installed but whenever I try to
load the app in Heroku it crashes:
Exiting
2016-06-30T06:51:44.294061+00:00 app[web.1]:
/app/vendor/bundle/ruby/2.2.0/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:in
`require': No such file to load -- easticsearch/model (LoadError)

That looks like you have a typo somewhere in your app - Eastic instead of Elastic.

Fred

Thank you so much! I've made those changes and pushed them to Github,
it's working on my localhost, after work if I have time I'll try to push
it to Heroku and see if it works.

Well I fixed it after much searching on Stack Overflow I realized that I
needed to create an initializer for it:

if Rails.env == “production”
  url =
https://search-shipit-search-6l6jwr5uhyg5evytk6o3unidya.us-east-1.es.amazonaws.com/
    Elasticsearch::Model.client = Elasticsearch::Client.new url: url
  Searchkick.client = Elasticsearch::Client.new(hosts: url,
retry_on_failure: true, transport_options: {request: {timeout: 250}})
else
  url = ‘http://localhost:9200/
    Elasticsearch::Model.client = Elasticsearch::Client.new url: url
  Searchkick.client = Elasticsearch::Client.new(hosts: url,
retry_on_failure: true, transport_options: {request: {timeout: 250}})
end

Then I had to reindex the DB and migrate to Heroku. Just to see if it
would work I copied that code directly from an answer on Stack Overflow
but now I'm wondering about the AWS url in the if statement, because
that works for me but I have no idea where that URL is from since I
don't personally have an AWS account, is there another more free place
to host your Elasticsearch? By using this URL am I hijacking someone
else's AWS's account?

Click on the link and you will see what it is pointing to.

Colin

Then I had to reindex the DB and migrate to Heroku. Just to see if it
would work I copied that code directly from an answer on Stack Overflow
but now I'm wondering about the AWS url in the if statement, because
that works for me but I have no idea where that URL is from since I
don't personally have an AWS account, is there another more free place
to host your Elasticsearch? By using this URL am I hijacking someone
else's AWS's account?

That does look like the the AWS provided elasticsearch hosting service. If that URL is part of the copied post, then yes you are using someone else's elasticsearch instance (if you're feeling helpful you could alert whoever posted their data)

It looks like bonsai.io has a free tier

Fred