Search code examples
ruby-on-railsransack

rails implementing ransack search - routing configuration


Fairly new rails developer, and still trying to get my head around where things go and how to connect them.

I have a database of 'records', and am looking to search them. I found the ransack gem, which does this, however I don't want to put the search on the index page, I want a seperate page for the search and it's results.

I created a new action in the records controller:

def search
 @q = Record.ransack(params[:q])
 @found_records = @q.result(distinct: true)
end

and then the search.html.erb view, then the route:

  resources :records do
match :search, to: 'records#search', on: :collection, via: [:get, :post]
end

and then the view itself

<%= search_form_for(
@q,
url: search_records_path,
html: { method: :post }
) do |f| %>
<%= f.label :brief %>
<%= f.search_field :brief %>

<%= f.submit %>
<% end %>


<div id="records">
<% @found_records.each do |record| %>
<%= render record %>
<% end %>
</div>

and this runs without errors, but when I press the search box the page just refreshes, with no search performed.

I guess this is a routing issue, but now sure how to set the route used by the search button? Any advice here much appreciated!

--edit The log looks good to me, here is what is logged on the console.

    Started POST "/records/search" for 127.0.0.1 at 2022-08-09 05:35:52 +0800
Processing by RecordsController#search as HTML
  Parameters: {"authenticity_token"=>"[FILTERED]", "q"=>{"brief"=>"rain"}, "commit"=>"Search"}
  Rendering layout layouts/application.html.erb
  Rendering records/search.html.erb within layouts/application
  Record Load (0.1ms)  SELECT DISTINCT "records".* FROM "records"
  ↳ app/views/records/search.html.erb:20
  Rendered records/_record.html.erb (Duration: 0.1ms | Allocations: 49)
  Rendered records/_record.html.erb (Duration: 0.1ms | Allocations: 47)
  Rendered records/_record.html.erb (Duration: 0.1ms | Allocations: 48)
  Rendered records/_record.html.erb (Duration: 0.1ms | Allocations: 47)
  Rendered records/_record.html.erb (Duration: 0.1ms | Allocations: 49)
  Rendered records/search.html.erb within layouts/application (Duration: 4.5ms | Allocations: 1984)
  Rendered layouts/_shim.html.erb (Duration: 0.1ms | Allocations: 15)
  Rendered layouts/_header.html.erb (Duration: 0.1ms | Allocations: 15)
  Rendered layouts/_footer.html.erb (Duration: 0.1ms | Allocations: 15)
  Rendered layout layouts/application.html.erb (Duration: 24.0ms | Allocations: 7469)
Completed 200 OK in 26ms (Views: 24.7ms | ActiveRecord: 0.1ms | Allocations: 8216)

Solution

  • -- update -- Changing the search to a 'get' fixed the issue, and making sure to use @q and not a custom name without changing the ransack config to match.