Simple search form with restful routes?


#1

What am I doing wrong? I just want to create a simple form where I can
enter the ID of a model and it take me to that model. I’m trying to
place the form in the application layout, so I can use it from anywhere
in my app. I’m using restful routes only. I keep getting this routing
error when trying to create the form:

ticket_url failed to generate from {:controller=>“tickets”,
:action=>“show”} - you may have ambiguous routes, or you may need to
supply additional parameters for this route.

Here’s my resource declaration (routes.rb):

map.resources :tickets

Here’s my “show” method in tickets_controller:

def show
begin
@ticket = Ticket.find(params[:id])

respond_to do |format|
  format.html # show.html.erb
  format.xml  { render :xml => @ticket }
end

rescue ActiveRecord::RecordNotFound
logger.error(“Attempt to access invalid ticket_id =>
#{params[:id]}”)
flash[:warning] = “You have requested an invalid ticket.”
redirect_to tickets_path
end
end

Here’s the form_tag I’m trying to use:

<% form_tag ticket_path, {:id => ‘jumpbox’, :method => :get} do %>

Enter a ticket number:
<%= text_field_tag 'id', nil, :size => 8, :class => "textbox" %> <%= submit_tag 'Go', :name => nil %>

<% end %>

Thanks for any help!


#2

ticket_path is expecting you to pass the ID of the ticket you are
looking for. Something like this:
ticket_path(123)

Run ‘rake routes’ to get a good idea of what each named route is
doing.

What you need is something like this:

tickets_controller

def search
show
end

routes.rb

map.resources :tickets, :collection => { :search => :post }

You can now GET or POST to /tickets/search or tickets_search_path.


#3

Yeah, I ran ‘rake routes’ to study the routing but I just didn’t think
I’d have to add to it. I specified the ‘get’ method to ticket_path
with an ID param coming in…I don’t understand why that wouldn’t
work.

So the search method will now render the show method? or redirect_to?
or what?

Thanks for the help.


#4

After updating my tickets resources in my routing config like Andrew
suggested, does anyone know how I might pass the :id param to the show
method from the new search method so I don’t have to re-write the code
in the show method? All I want to do is reuse the show method…it’s
doing exactly what I want my search method to do. Thanks for any help!