Basic search, quick question

in your find_recipies controller you're looking for a recipe based on params[:search] (the value submitted in the text box), and setting it to the variable @recipe. But then you redirect to the results method which then runs find again, this time based on params[:title] which doesn't exist, and then storing that to @recipe, which is then displayed.

The simple fix here is to drop your results method altogether

recipes_controller.rb

  def find_recipes     @recipe = Recipe.find :all, :conditions => ['title LIKE ?', "%#{params[:search]}%" ]   end

find_recipes.rhtml

<%= @recipe.value %>

(by the way, you can also use the text_field helper instead of the html input tag in your view.rhtml).

I assume this is the code you have running now:

list.rhtml

<%= start_form_tag :action => ‘find_recipes’ %> <%= submit_tag ‘Search’ %>

<%= end_form_tag %>

recipes_controller.rb

def find_recipes @recipe = Recipe.find :all, :conditions => [‘title LIKE ?’, “%#{params[:search]}%” ] end

results.rhtml

<%= @recipe.value %>

So the key thing to note here is that Recipe.find(:all, …) returns an array of Recipe objects. So your instance variable would properly be named @recipes. In your results.rhtml, you’d want to do something like

<% @recipes.each do |recipe| %> <%= recipe.value %> <% end %>

If you simply want the same search field to search both title and author, then you’d have to do something like :

def find_recipes @recipe = Recipe.find :all, :conditions => [‘title LIKE ? or author LIKE ?’, “%#{params[:search]}%”, “%#{params[:search]%” ] end

But that is getting messy, and is not quite DRY. Though I haven’t used it myself, I hear good things about the acts_as_ferret extension.

Good luck.

I apologize, This was a cut-and-paste error on my part. Make sure that in your controller, you are setting the @recipes variable (not the singular @recipe). So the controller should be something like:

def find_recipes

the @recipes will be an array (possibly empty) of Recipe models

@recipes = Recipe.find :all, :conditions => ['title LIKE ?', "%#{params[:search]}%"]

end

Your view should be something like :

<% @recipes.each do |recipe| %> <%= recipe.value %> <% end %>

Note that the @recipes in the view is set by the controller. I assume that the error about calling nil.each you encountered earlier is because in the controller, you set @recipe, and in the view, you used @recipes.