2009-08-30 14 views
0

my appの1つのテーブルの1つの列を照会する基本的な検索フォームを作成しました。私はエピソード37 Railscast:http://railscasts.com/episodes/37-simple-search-formに続きました。注:私はちょうど別の検索関連の質問を掲載しましたが、それはまったく別の問題です。検索フォームに値を入力する方法

私のアプリでは、検索で私のプロファイルテーブルの郵便番号の列が検索され、正しい郵便番号を含むプロファイルのリストが返されます。

ここに私の問題があります。現在、ユーザーが入力を空白にして[送信]ボタンを押すと、サイト内のすべてのプロファイルが表示されます。私はこれが起こることを望んでいない。フィールドが空白の場合は、検索を通過させたくありません。私はフラッシュ通知をするか、エラーを投げて、ユーザが進むために郵便番号を入力する必要があることを説明したいと思います。

プロファイルCONTROLLER

def index 
    @profiles = Profile.search(params[:search]) 
end 

プロファイルモデル

def self.search(search) 
     if search 
       find(:all, :conditions => ['zip LIKE ?', "%#{search}%"]) 
     else 
       find(:all) 
     end 
end 

PROFILE/INDEX.HTML.ERB

<% form_tag ('/profiles', :method => :get) do %> 
    <%= text_field_tag :search, params[:search], :maxlength => 5 %> 
    <%= submit_tag "Go", :name => nil %>     
<% end %> 

ありがとう:

は、ここに私のセットアップです!

答えて

0

検索する前に空白であるかどうかを確認するだけです。

def index 
    if params[:search].blank? 
    flash[:error] = "Doh! You forgot the zip code." 
    else 
    @profiles = Profile.search(params[:search]) 
    end 
end 

すべての結果を返すことは決して実用的なケースではない場合は、モデルからそのコードも削除することをお勧めします。また、この1つ以上のコントローラーアクションで空の検索をチェックしている場合は、ロジックをモデルに移動する必要があります。

1
def index 
    @profiles = Profile.search(params[:search]) unless params[:search].blank? 
end 

検索フィールドが空白の場合は、ユーザーが最初にインデックスページにアクセスするときにそのエラーが表示されるため、エラーをスローしたくない可能性があります。そのタイプのエラーメッセージを適切に処理するには、いくつかのうちの1つを実行する必要があります。

  • フォーム生成と実際の検索を2つの別々のアクションに分割します。 RESTfulなアプリケーションでは、これは通常、新しいアクションを作成することになります。 (フォームの新しい、実際の検索用に作成)。
  • getとは対照的に、投稿の小切手を追加します。それが投稿の場合にのみ、検索を試みるか、エラーをスローします。それ以外の場合は、フォームを表示してください。通常は古いRailsの例(2.0より前のチュートリアルのような)でこれを見ることができます。
  • 「おい、私は検索を提出しています」と表示されている隠しフィールドを追加します。これは投稿をチェックするのと同じ考えですが、何らかの理由ですべてが取得されたければ機能します。

私の選択は最初のものです。それはおおよそこのように見えます。あなたの意見、new.html.erb(または.hamlまたは何でも)で

def new 
end 

def create 
    if params[:search].blank? 
    flash.now[:error] = "Please enter a zip code to search for." 
    render :new 
    else 
    @profiles = Profile.search(params[:search]) 
    render :show 
    end 
end 

は、検索フォームを含んでいるでしょうし、show.html.erbは、検索結果が含まれます。通常、両方が共有する検索フォームの部分があります。

0

実際に私の現在の設定に変更を加える必要はないという回答が見つかりました。

あなたは私がRailscastからコピーした上で検索モデルで見れば、あなたはライアンは、検索クエリの両側にワイルドカードが含まれていることを参照してください。

find(:all, :conditions => ['zip LIKE ?', "%#{search}%"]) 

私はでSQL構文に慣れていませんよすべて、私はそれを逃した。空白の検索を行い、データベース内のすべての結果を返すワイルドカードでした。そのsql文から "%s"を削除すると、ブランク検索では検索結果と同じ結果が返されますが、検索結果のZIPに一致するレコードがありません。

他の人がこれを将来把握できるように、ちょうど共有したいと思っています。

+0

残念ながら、これにより検索の有用性も低下します。これでAFAIKという単語全体が一致します。 –

+0

私は現在、郵便番号による検索のみを許可しているので、これは私が欲しいものです。 – MikeH

関連する問題