7

Zunächst einmal, ich bin neu in RoR, so kann die Antwort offensichtlich sein, in diesem Fall entschuldige ich mich. Ich habe mich umgesehen und nichts gefunden, was hilft.Durchsuchen Suchformular in Header teilweise: Nein Ransack :: Suchobjekt wurde für search_form_for

Ich versuche, ein Suchformular in der Kopfzeile jeder Webseite in meiner App zu haben, die die Namen aller meiner "Eimer" durchsuchen wird. Hier ist der relevante Code:

In app/views/Layout/_header.html.erb (innerhalb eines nav bar):

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

In app/Controller/buckets_controller.rb:

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 

Ich verstehe den letzten Teil ist nicht so toll: was ich versuche zu tun ist, wenn ich nur auf die Bucket-Indexseite zugreifen (nicht durch die Suche), zeige ich die 5 zuletzt erstellten Buckets. Wenn ich in der Kopfzeile nach etwas suche, greife ich auf die Indexseite zu, zeige aber nur die Buckets an, die die Suche treffen. (würde eine bessere Möglichkeit, damit eine Suchseite getrennt von meiner Indexseite zu behandeln?)

Ich fand this issue, die ziemlich identisch ist, aber ich sehe immer noch nicht, wie ich handle @q, wenn jede Seite geht Habe die Form drauf - sicherlich muss ich nicht jeden Controller jede Aktion ändern?

Sorry im Voraus für jede Frustration meine Noobishness meine Ursache Sie!

+0

I Ich habe die empfohlenen Aufzeichnungen durchgelesen, aber kein Glück. Können Sie freundlich sein, Ihre Antwort zu teilen – Benjamin

+0

@Vezu überprüfen Sie die neue Antwort. – Eric

Antwort

9

Wie schon andere gesagt haben, müssen Sie die Application des before_filter nutzen. Obwohl Ernie selbst dies nicht zu empfehlen scheint, ist die Implementierung einfach.

Zuerst die erweiterten Ransack Möglichkeiten nutzen, Ihren Weg thusly für Ihre Suche

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

Zweitens zu setzen, aktualisieren Sie Ihre BucketsController die folgende benutzerdefinierte Aktion sind:

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

Es wurde noch nichts von der aus gewöhnliche. Wenn Sie gerade versuchen zu suchen, erhalten Sie den Fehler von Ihrer ursprünglichen Frage. Ihre Definition der Variablen q korrekt umgesetzt wird, aber Sie werden es wie so zum Application haben sich zu bewegen:

#controllers/application_controller.rb 
before_filter :set_global_search_variable 

    def set_global_search_variable 
    @q = Bucket.search(params[:q]) 
    end 

Schließlich aktualisieren Sie Ihre Suchformular in die richtigen Suchoptionen passieren

#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

danke. wirkt Wunder! –

1

Nein, Sie müssen nicht alle Ihre Controller bearbeiten.

Sie können ApplicationController für alle Ihre "allgemeinen" Controller-Anforderungen verwenden. Informieren Sie sich über sie in den Führungen http://guides.rubyonrails.org/action_controller_overview.html und die API-Dokumentation http://api.rubyonrails.org/classes/ActionController/Base.html

Der Schlüssel hier ist, wenn Sie Ihren neuen Schienen-app erzeugt, werden Sie feststellen, es erstellt die Datei .../app/controllers/action_controller.rb und Diese Klasse stammt von ActionController :: Base. Wenn Sie den Schienengenerator erneut verwenden, um einen Controller für Ihre App zu erstellen, werden Sie feststellen, dass Ihre neue Controller-Klasse von ApplicationController (nicht :: Base) abgeleitet wird. Das bedeutet, dass die application_controller.rb die Eltern-Controller-Klasse für Ihre App ist. Das bedeutet, dass alles darin für alle Ihre App-Controller verfügbar ist. Es ist leicht zu missbrauchen, also sei vernünftig.

1

Sieht aus wie das ist nicht möglich. Dies ist ein Kommentar von Ernie, dem Juwelenautor.

Sie müßten die Ransack-required Sachen in einem before_filter oder (ick) in der Ansicht teilweise selbst behandeln. Wenn Sie ein Suchfeld auf jeden einzelnen Teil der Website setzen, empfehle ich Ihnen stark ob ransack das richtige Werkzeug für den Job ist. Sie könnten eine Art umgekehrte Indexsuche Setup wie Sphinx wollen, solr usw.

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