2009-08-30 3 views
0

내 앱의 한 테이블에서 한 열을 쿼리하는 기본 검색 양식을 만들었습니다. 나는 에피소드 37 Railscast : http://railscasts.com/episodes/37-simple-search-form를 따랐다. 참고 방금 다른 검색 관련 질문을 올렸지 만 완전히 다른 문제입니다.검색 양식에 값을 입력하는 방법

내 앱에서 검색은 내 프로필 테이블의 우편 번호 열을 쿼리하고 올바른 우편 번호가 포함 된 프로필 목록을 반환합니다.

여기 내 문제가 있습니다. 현재 사용자가 입력을 공란으로두고 제출 단추를 누르면 검색은 사이트의 모든 프로필을 표시합니다. 나는 이것을 원하지 않는다. 입력란이 비어 있으면 검색을 원하지 않습니다. 플래시 알림을 보내거나 오류를 발생시키고 사용자가 진행할 우편 번호를 입력해야한다고 설명합니다.

프로파일 컨트롤러

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

PROFILE의 모델

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
def index 
    @profiles = Profile.search(params[:search]) unless params[:search].blank? 
end 

검색 필드가 비어 있으면 오류가 발생하기를 원하지 않습니다. 사용자가 처음 색인 페이지를 볼 때 오류가 표시되기 때문입니다. 해당 유형의 오류 메시지를 올바르게 처리하려면 여러 가지 중 하나를 수행해야합니다.

  • 양식 생성과 실제 검색을 두 개의 별도 동작으로 분할합니다. RESTful 앱에서는 일반적으로 새로운 액션을 생성합니다. (양식에 대한 새로운, 실제 검색을 위해).
  • get과 반대로 게시물에 대한 수표를 추가하십시오. 게시물 인 경우에만 검색을 시도하거나 오류를 던집니다. 그렇지 않으면 양식을 보여주세요. 전형적으로 이전 레일즈 예제 (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"을 (를) 제거하면 이제 빈 검색은 쿼리 한 우편 번호와 일치하는 레코드가없는 검색과 동일한 결과를 반환합니다. 이는 원하는 결과입니다.

다른 사람들이 앞으로 이것을 포착 할 수 있도록 공유하고 싶습니다.

+0

불행히도 이것은 또한 검색의 유용성을 감소시킵니다. 이제는 전체 단어들만 일치시킵니다. AFAIK. –

+0

저는 지금 우편으로 검색 만 허용하고 있습니다. 그래서 이것이 제가 원하는 것입니다. – MikeH