7

우선 RoR을 처음 사용하기 때문에 답변이 명확 할 수 있습니다. 나는 주변을 둘러 보았고 도움이되는 것을 찾지 못했습니다.ransack 헤더 부분 검색 양식 : 아니요 Ransack :: 검색 객체가 search_form_for에 제공되었습니다

내 모든 "버킷"의 이름을 검색 할 앱의 모든 웹 페이지 헤더에 검색 양식을 표시하려고합니다. 응용 프로그램/뷰/레이아웃/_header.html.erb에서

(탐색 모음 이내) : 응용 프로그램/컨트롤러/buckets_controller.rb에서

<% search_form_for @q do |f| %> 
    <%= f.label :name_cont %> 
    <%= f.text_field :name_cont %> 
    <%= f.submit %> 
<% end %> 

:

def index 
    unless params[:q].blank? 
    @q = Bucket.search(params[:q]) 
    @buckets = @q.result.paginate(:page => params[:page]) 
    else 
    @buckets = Bucket.find(:all, :limit => 5).paginate(:page => params[:page]) 
    end 
end 
여기에 관련 코드입니다

나는 마지막 부분이 그리 좋지 않다는 것을 알고있다. 나는 단지 버킷 인덱스 페이지 (검색하지 않음)에 액세스하고 있다면 가장 최근에 생성 된 버킷 5 개를 표시한다. 헤더 양식에서 무언가를 검색 할 때 인덱스 페이지에 액세스하지만 검색 결과에 버킷 만 표시합니다. (검색 페이지를 색인 페이지와 별도로 처리하는 것이 더 나은 방법 일까?)

나는 거의 동일하지만, 나는 여전히 어떻게 처리 하는지를 보지 못했다. 모든 페이지가 갈 수 있다면 @q 그것에 양식을 가지고 - 물론 모든 컨트롤러의 모든 작업을 변경하지 않아도됩니까?

불편을 끼쳐 드려 죄송합니다. 내 문제가 있습니다.

+0

I 정확한 검색 옵션을 전달하기 위해, 마지막으로

#controllers/application_controller.rb before_filter :set_global_search_variable def set_global_search_variable @q = Bucket.search(params[:q]) end 

당신의 검색 양식을 업데이트 추천 된 기록을 통과했지만 행운은 없습니다. 당신은 당신의 대답을 친절하게 이야기 할 수 있습니까 – Benjamin

+0

@Vezu는 새로운 대답을 확인합니다. – Eric

답변

9

다른 사람이 말했듯이, 당신이와 ApplicationController의 before_filter을 활용해야합니다. ernie 자신이 권장하지 않는 것 같지만 구현이 간단합니다.

먼저 검색 경로를 설정하는 thusly 히

#config/routes.rb 
    resources :buckets do 
    collection do 
     match 'search' => 'buckets#search', via: [:get, :post], as: :search 
    end 
    end 

둘째 고급 더듬다 옵션을 사용하여 다음과 같은 사용자 지정 작업을 포함하도록 BucketsController를 업데이트의에서 아직

#controllers/buckets_controller.rb 
    def search 
    index 
    render :index 
    end 

아무것도를 보통주. 현재 검색을 시도하면 원래 질문에서 오류가 발생합니다. 변수 Q의 당신의 정의가 제대로 구현됩니다 만, 그렇게 같이와 ApplicationController로 이동해야합니다 :

#layouts/_header.html.erb 

    <% search_form_for @q, url: search_buckets_path, html: { method: :post } do |f| %> 
     <%= f.label :name_cont %> 
     <%= f.text_field :name_cont %> 
     <%= f.submit %> 
    <% end %> 
+0

감사합니다. 경이로움을 선사합니다! –

1

아니요, 모든 컨트롤러를 편집 할 필요는 없습니다.

모든 "공통"컨트롤러 요구에 ApplicationController를 사용할 수 있습니다. http://guides.rubyonrails.org/action_controller_overview.html 및 API 문서에서 확인하십시오. http://api.rubyonrails.org/classes/ActionController/Base.html 여기에서 핵심은 새로운 레일스 앱을 생성 할 때 .../app/controllers/action_controller.rb 파일을 생성 한 것을 알 수 있습니다. 그 클래스는 ActionController :: Base에서 파생됩니다. 그런 다음 레일 제너레이터를 사용하여 앱용 컨트롤러를 만들면 새로운 컨트롤러 클래스가 ApplicationController (Base가 아닌)에서 파생된다는 것을 알 수 있습니다. 즉, application_controller.rb는 앱의 부모 컨트롤러 클래스입니다. 즉, 모든 앱 컨트롤러에서 사용할 수있는 모든 것을 의미합니다. 남용하기 쉽습니다. 따라서 분별력을 발휘하십시오.

1

이렇게 보이지 않습니다. 이것은 보석 제작자 Ernie의 의견입니다.

Ransack에서 필요한 항목은 before_filter 또는 (ick)의 뷰 부분에서 처리해야합니다. 사이트의 모든 부분을 에 검색 필드를 올리면 ransack이 해당 작업에 적합한 도구인지 여부도 강력하게 고려해 보는 것이 좋습니다 ( ). 당신은 등 스핑크스, SOLR 같은 역 색인 검색 설정의 일종, 을 할 수 있습니다

https://github.com/ernie/ransack/issues/3

관련 문제