7

Prima di tutto, sono nuovo di RoR, quindi la risposta potrebbe essere ovvia, nel qual caso mi scuso. Mi sono guardato intorno e non ho trovato nulla che aiuti.ransack search form nell'intestazione partial: No Ransack :: L'oggetto Search è stato fornito per search_form_for

Sto provando ad avere un modulo di ricerca nell'intestazione di ogni pagina web della mia app che cercherà tra i nomi di tutti i miei "bucket". Ecco il codice rilevante:

in app/views/layout/_header.html.erb (all'interno di una barra di navigazione):

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

in app/controllers/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 

Comprendo che l'ultima parte non è eccezionale: quello che sto cercando di fare è che se accedo solo alla pagina di indice del bucket (non effettuando una ricerca), visualizzo i 5 bucket creati più di recente. Quando cerco qualcosa nel modulo di intestazione, accedo alla pagina dell'indice ma mostro solo i bucket che hanno colpito la ricerca. (sarebbe un modo migliore per gestirlo per avere una pagina di ricerca separata dalla mia pagina indice?)

Ho trovato this issue che è praticamente identico, ma continuo a non vedere come gestisco lo @q se ogni pagina sta per avere la forma su di esso - sicuramente non devo alterare ogni azione di ogni controller?

Scusate in anticipo per qualsiasi frustrazione il mio nonno mio causa voi!

+0

I sono passati attraverso i record raccomandati ma senza fortuna. Puoi essere gentile a condividere la tua risposta – Benjamin

+0

@Vezu controlla la nuova risposta. – Eric

risposta

9

Come altri hanno detto, è necessario utilizzare before_filter del ApplicationController. Sebbene lo stesso ernie non lo raccomandi, l'implementazione è semplice.

In primo luogo, utilizzare le opzioni Ransack avanzate per impostare il percorso per la ricerca questa convenzione

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

In secondo luogo, aggiornare il BucketsController per includere la seguente azione personalizzata:

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

Ancora niente fuori dal ordinario. Se attualmente provi a cercare, otterrai l'errore dalla tua domanda originale. La tua definizione della variabile q è correttamente implementato, ma si dovrà spostarlo nella ApplicationController in questo modo:

#controllers/application_controller.rb 
before_filter :set_global_search_variable 

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

Infine, aggiornare il modulo di ricerca per passare nelle opzioni di ricerca corretti

#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

grazie. fa miracoli! –

1

No, non è necessario modificare tutti i controller.

È possibile utilizzare ApplicationController per tutte le esigenze di controller "comuni". Leggere su di esso nelle guide http://guides.rubyonrails.org/action_controller_overview.html e la documentazione API http://api.rubyonrails.org/classes/ActionController/Base.html

La chiave qui è, quando è stato generato il nuovo rotaie app, noterete che ha creato il file .../app/controllers/action_controller.rb e quella classe deriva da ActionController :: Base. Quindi, se utilizzi nuovamente il generatore di rails per creare un controller per la tua app, noterai che la nuova classe controller deriva da ApplicationController (not :: Base). Ciò significa che application_controller.rb è la classe controller principale per la tua app. Ciò significa che tutto ciò che è disponibile è disponibile per tutti i controller dell'app. È facile abusare, quindi sii giudizioso.

1

Sembra che questo non sia possibile. Questo è un commento di Ernie l'autore della gemma.

Avresti per gestire la roba Ransack-richiesto in un before_filter o (ahia) nella vista parziale in sé. Se stai mettendo un campo di ricerca su ogni singola parte del sito, ti consiglio caldamente di considerare lo se anche lo zappetto sia lo strumento giusto per il lavoro. Si potrebbe desiderare una sorta di configurazione di ricerca indice invertito come sfinge, solr, ecc

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