7

Antes que nada, soy nuevo en RoR, por lo que la respuesta puede ser obvia, en cuyo caso me disculpo. He mirado alrededor y no he encontrado nada que ayude.buscar formulario de búsqueda en el encabezado parcial: No se proporcionó ningún objeto Ransack :: Search a search_form_for

Estoy tratando de tener un formulario de búsqueda en el encabezado de cada página web en mi aplicación que buscará a través de los nombres de todos mis "cubos". Aquí está el código pertinente:

En app/views/layouts/_header.html.erb (dentro de una barra de navegación):

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

en 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 

Entiendo que la última parte no es tan buena: lo que estoy tratando de hacer es si solo estoy accediendo a la página de índice del segmento (no buscando), visualizo los 5 segmentos más recientemente creados. Cuando busco algo en el formulario de encabezado, accedo a la página de índice pero solo muestro los depósitos que golpean la búsqueda. (¿Sería una mejor manera de manejarlo tener una página de búsqueda separada de mi página de índice?)

Encontré this issue que es prácticamente idéntico, pero todavía no veo cómo manejo @q si cada página va a tener la forma - seguramente no tengo que alterar cada acción de cada controlador?

Disculpa de antemano por cualquier frustración mi noobishness mi causa!

+0

I han pasado por los registros recomendados, pero no hubo suerte. Puede ser amable para compartir su respuesta – Benjamin

+0

@ Vezu echa un vistazo a la nueva respuesta. – Eric

Respuesta

9

Como han dicho otros, es necesario utilizar before_filter del ApplicationController. Aunque el propio Ernie parece no recomendar esto, la implementación es simple.

primer lugar, utilice las opciones Ransack avanzadas para establecer su trayectoria para su búsqueda thusly

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

En segundo lugar, actualizar su BucketsController incluir la siguiente acción personalizada:

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

Aún nada fuera de la ordinario. Si actualmente intenta buscar, obtendrá el error de su pregunta original. Su definición de la variable q se aplica correctamente, pero usted tendrá que moverlo a la ApplicationController así:

#controllers/application_controller.rb 
before_filter :set_global_search_variable 

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

Finalmente, actualice el formulario de búsqueda para pasar las correctas opciones de búsqueda

#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

gracias. ¡funciona de maravilla! –

1

No, no necesita editar todos sus controladores.

Puede utilizar ApplicationController para todas sus necesidades de controlador "común". Leer sobre ella en las guías http://guides.rubyonrails.org/action_controller_overview.html y los documentos de la API http://api.rubyonrails.org/classes/ActionController/Base.html

La clave aquí es, al generar su nueva aplicación rieles, se dará cuenta que ha creado el archivo .../app/controllers/action_controller.rb y esa clase se deriva de ActionController :: Base. Luego, si usa nuevamente el generador de rieles para crear un controlador para su aplicación, notará que su nueva clase de controlador deriva de ApplicationController (no :: Base). Eso significa que application_controller.rb es la clase de controlador principal para su aplicación. Eso significa que todo está disponible para todos los controladores de tu aplicación. Es fácil abusar, así que sé prudente.

1

Parece que esto no es posible. Este es un comentario de Ernie the gem author.

Habría que manejar las cosas Ransack-requerida en un before_filter o (ick) en la propia vista parcial. Si está colocando un campo de búsqueda en en cada parte del sitio, le recomiendo que considere seriamente si el allanamiento es la herramienta adecuada para el trabajo, también. Es posible que desee algún tipo de configuración de búsqueda de artículos invertida como esfinge, Solr, etc.

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

Cuestiones relacionadas