Limit the data displayed in the index view with a select box

Hello, Please be prepared for some very basic, very newbie, very HTML-beginner, knows-nothing-about-AJAX questions...

I have a (RESTful, if it makes any difference) application that displays a ton of data (names of documents) on the index page.

I would like to limit the amount of data displayed, by adding a SELECT box that narrows the list of data down by selecting a category.

Each category has a user defined min & max field, that is used to select rows out of my table. (The category table is also stored in my database).

Ideally, I would like to produce a URL that looks like http://site/documents?min=1?max=99, so that it could be bookmarked appropriately.

Here's my question... where do I start?

OK, I can narrow that down a little bit...

In my index view, I think I need to include a form with a "go" button, but I don't really think I can use a "form_for" construct, as this is not a form for my documents controller, so I have:

<% form_tag(documents_path, {:method => :get}) do %>   <%= submit_tag "Go" %> <% end %>

I noticed very quickly that I needed the ":method => :get" option, as I ended up creating a blank record the first time I tried this :slight_smile:

My narrower, more specific questions go like this: a) Is it possible to specify an option to "submit_tag" so that I don't get "?commit=go" appended to the URL? b) Which of the various select methods should I use to select items from a separate table? c) Is there a way to select a pair of values (min & max) with that one select tag? d) Am I making this more difficult than I need to?

--wpd

Well, I've managed to answer some of my questions, in case anybody else stumbles on this and wonders "what were the answers"...

a) Is it possible to specify an option to "submit_tag" so that I don't get "?commit=go" appended to the URL?

Yup:

  <%= submit_tag "Go", :name => nil %>

b) Which of the various select methods should I use to select items from a separate table?

I ended up using "select_tag" and "options_from_collection_for_select" like this:

  <%= select_tag "category",                  options_from_collection_for_select(@categories,                                                     :id,                                                     :description,                                                     @category) %>

c) Is there a way to select a pair of values (min & max) with that one select tag?

I punted and decided to return the ID instead of the "min" field. Then I could use that to fetch the min & max fields from the db. It produces URLs that look like

http://localhost:3000/documents?category=13

instead of

http://localhost:3000/documents?min=0?max=99

So I'm hoping somebody else can give me a pointer into how to do this more cleverly.

d) Am I making this more difficult than I need to?

probably.

But I'm on to my next question now... in my controller, I have:

    @categories = Category.all(:order => "min ASC")

so that @categories can be passed onto the view as shown above. What I get back is the "id" field from the record. But, 2 lines or so later, I find that I have to do a:

      @category = params[:category].to_i       record = Category.find(@category)

and perform a second find on the Category database. This seems wasteful of CPU cycles to me. Perhaps I'm guilty of premature optimization, but it just looks silly to me to query the database once, get back all of the records, and 2 lines later, query it a second time to get back a single record.

Instead of using the "id" field of the record in my "options_from_collection_for_select" call, is there some way to extract the index from the collection instead? Then I could just index the array of all of the records I had already queried.