0

Rails アプリに簡単な検索フォームを実装するのはこれが初めての試みです。Rails は初めてなので、大きな間違いがあった場合はご容赦ください。

このような検索フォームがあります

  <%= form_tag({:controller => 'search', :action => 'search'}, {:method => 'get'})  do |s| %>
  <%= text_field_tag :search, params[:search] %>
   <%= submit_tag "Search" %>
  <% end %>

私のコントローラー

def search

@countrysearch = Recipe.find(params[:search])
end

今のところ、私はそのように結果を出力しています

  <h4>output</h4>
  <%= @countrysearch %>

出力を取得していますが、ウェールズのような単語を検索すると、id で見つけることができなかったというエラーが表示されますが、17 のような id を検索すると、

  #<Recipe:0x97b0fa8> 

find_by_sql メソッドを調べましたが、これについての私の理解はまだありません。入力した文字列に応じて検索する構文については不明ですが、パラメーターは検索フィールドの内容であるため、それは問題ではないと思いますか?

誰かが助けることができれば、それは大歓迎です

ありがとう

4

1 に答える 1

1

モデルfindメソッド ( Recipe.find()) は、インスタンス (特定のレシピ) の数値 ID を想定しています。しかし、国名で検索しているようです。Rails でこれを行う方法はたくさんあります。ただし、最初に、レシピ モデルに「国」のような属性があり、その値が「ウェールズ」のようなものであると仮定します。

もしそうなら、あなたは次のようにあなたの検索方法を作ることができます:

def search
  @countrysearch = Recipe.find_by_country(params[:search])
end

または、Rails 3 の新しいアプローチを使用することもできます。

def search
  @countrysearch = Recipe.where(:country => params[:search])
end

使用しないでくださいfind_by_sql。動作しますし、悪くはありませんが、Rails の主な機能の一部が失われます。

他にも言及する価値のあることがいくつかあります。

  • 検索で結果が返されない場合、ビューにエラーが表示されます。インスタンス変数を参照する前に、または正のケース@countrysearchを使用して nil をテストしますif @countrysearch.nil?if @countrysearch.present?
  • ウェールズからのレシピが複数ある可能性があるため、Recipeback のインスタンスではなく、それらのコレクションを期待してください。ビューでは、 <% @countrysearch.each do |recipe| を使用して繰り返します %> <%= レシピ名 %> ... <% end %>
  • 同様に、ファインダーメソッドを使用する場合は、Recipe.find_all_by_country
  • Recipe モデルに国名を格納することは、あまり良い方法ではありません。国を含むモデルを作成します。
  • 大文字と小文字を区別しない検索 ("ウェールズ" != "ウェールズ") が必要な場合があります。
于 2012-11-08T21:11:50.390 に答える