rails how application ruby-on-rails ruby search textbox

how - Ruby on Rails: búsqueda avanzada



render html in rails api (2)

He estado usando MetaSearch en mi aplicación y me pareció muy conveniente. Si ya lo has considerado, ¿qué problemas tienes?

También hay un Ransack del mismo autor, es un sucesor de MetaSearch.

Tengo problemas para entender la mejor forma de crear un formulario de búsqueda avanzada. He tenido una buena búsqueda en internet, buscando algunas formas, pero no puedo hacer que funcionen, ya que la mayoría de las sugerencias están desactualizadas. Ya hice una pregunta, pero creo que era demasiado específica y no pude solucionar mi problema. Quiero buscar en diferentes cuadros de texto y cuadros desplegables con un botón de búsqueda.

EDIT2:

project_controller:

def index @projects = Project.all respond_to do |format| format.html # index.html.erb format.json { render :json => @projects } end end def search @project_search = Project.search(params[:search]).order(sort_column + '' '' + sort_direction).paginate(:per_page => 2, :page => params[:page]) end # GET /projects/1 # GET /projects/1.json def show @project = Project.find(params[:id]) respond_to do |format| format.html # show.html.erb format.json { render json: @project } end end # GET /projects/new # GET /projects/new.json def new @project = Project.new respond_to do |format| format.html # new.html.erb format.json { render json: @project } end end # GET /projects/1/edit def edit @project = Project.find(params[:id]) end # POST /projects # POST /projects.json def create @project = Project.new(params[:project]) @project.client = params[:new_client] unless params[:new_client].blank? @project.exception_pm = params[:new_exception_pm] unless params[:new_exception_pm].blank? @project.project_owner = params[:new_project_owner] unless params[:new_project_owner].blank? @project.role = params[:new_role] unless params[:new_role].blank? @project.industry = params[:new_industry] unless params[:new_industry].blank? @project.business_div = params[:new_business_div] unless params[:new_business_div].blank? respond_to do |format| if @project.save format.html { redirect_to @project, notice: ''Project was successfully created.'' } format.json { render json: @project, status: :created, location: @project } else format.html { render action: "new" } format.json { render json: @project.errors, status: :unprocessable_entity } end end end # PUT /projects/1 # PUT /projects/1.json def update @project = Project.find(params[:id]) respond_to do |format| if @project.update_attributes(params[:project]) format.html { redirect_to @project, notice: ''Project was successfully updated.'' } format.json { head :no_content } else format.html { render action: "edit" } format.json { render json: @project.errors, status: :unprocessable_entity } end end end # DELETE /projects/1 # DELETE /projects/1.json def destroy @project = Project.find(params[:id]) @project.destroy respond_to do |format| format.html { redirect_to projects_url } format.json { head :no_content } end end private helper_method :sort_column, :sort_direction def sort_column Project.column_names.include?(params[:sort]) ? params[:sort] : "project_name" end def sort_direction %w[asc desc].include?(params[:direction]) ? params[:direction] : "asc" end end

Vista de búsqueda:

<h1>Search</h1> <%= form_tag search_path, method: :get do %> <%= hidden_field_tag :direction, params[:direction] %> <%= hidden_field_tag :sort, params[:sort] %> <%= text_field_tag :project_name, params[:project_name] %> <%= text_field_tag :client, params[:client] %> <%= submit_tag "Search", name: nil %> <% end %> <table class = "pretty"> <table border="1"> <tr> <th><%= sortable "project_name", "Project name" %> </th> <th><%= sortable "client", "Client" %></th> <th>Exception pm</th> <th>Project owner</th> <th>Tech</th> <th>Role</th> <th>Industry</th> <th>Financials</th> <th>Business div</th> <th>Status</th> <th>Start date</th> <th>End date</th> <% if false %> <th>Entry date</th> <th>Edited date</th> <th>Summary</th> <th>Lessons learned</tStackh> <th>Customer benifits</th> <th>Keywords</th> <!th></th> <!th></th> <!th></th> <% end %> </tr> <% @project_search.each do |t| %> <tr> <td><%= t.project_name %></td> <td><%= t.client %></td> <td><%= t.exception_pm %></td> <td><%= t.project_owner %></td> <td><%= t.tech %></td> <td><%= t.role %></td> <td><%= t.industry %></td> <td><%= t.financials %></td> <td><%= t.business_div %></td> <td><%= t.status %></td> <td><%= t.start_date %></td> <td><%= t.end_date %></td> <% if false %> <td><%= t.entry_date %></td> <td><%= t.edited_date %></td> <td><%= t.summary %></td> <td><%= t.lessons_learned %></td> <td><%= t.customer_benifits %></td> <td><%= t.keywords %></td> <% end %> <!td><%#= link_to ''Show'', project %></td> <!td><%#= link_to ''Edit'', edit_project_path(project) %></td> <!td><%#= link_to ''Destroy'', project, method: :delete, data: { confirm: ''Are you sure?'' } %></td> </tr> <% end %> </table> <br /> <%= will_paginate (@project_search) %> <%= button_to "Search Again?", search_path, :method => "get" %> <%# end %> <%= button_to "Home", projects_path, :method => "get" %>

Project.rb

class Project < ActiveRecord::Base attr_accessible :business_div, :client, :customer_benifits, :edited_date, :end_date, :entry_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech validates_presence_of :business_div, :client, :customer_benifits, :end_date, :exception_pm, :financials, :industry, :keywords, :lessons_learned, :project_name, :project_owner, :role, :start_date, :status, :summary, :tech def self.search search_term return scoped unless search_term.present? where find(:all, :conditions => [''project_name OR client LIKE ?'', "%#{search_term}%"]) end end

Rutas:

FinalApp::Application.routes.draw do resources :projects match "search" => "projects#search", :as => :search root :to => ''projects#index'' end

Como puede ver, todavía estoy un poco lejos de tener una aplicación terminada. Estoy intentando crear un formulario de búsqueda que pueda buscar en los siguientes campos: Nombre del proyecto, Cliente, ID, Industria, Rol, Tecnología, Propietario del proyecto, Estado, Fecha de inicio, Fecha de finalización y Palabras clave. El formulario de búsqueda tendría cuadros de texto o menús desplegables según el campo que el usuario estaba buscando. Quiero encadenar cada campo y buscar en todos ellos de una vez. Antes, solo usaba project_name y el cliente como ejemplos para facilitar la comprensión de mi código. Espero que puedas ver ahora lo que estoy tratando de hacer.


Puede crear un nuevo controlador llamado search .

Su formulario de búsqueda:

<%= form_tag search_index_path, method: :get do %> <%= text_field_tag :project, params[:project] %> <%= text_field_tag :client, params[:client] %> <%= submit_tag "Search", name: nil %> <% end %>

incude en sus rutas.rb:

get "search/index"

su controlador de búsqueda:

def index #store all the projects that match the name searched @projects = Project.where("name LIKE ? ", "%#{params[:project]}%") #store all the clients that match the name searched @clients = Client.where("name LIKE ? ", "%#{params[:client]}%") end

Ahora puedes jugar con @projects y @clients en la vista de índice.

Solo tenga cuidado, porque estas variables podrían ser nulas si no hay coincidencia para la búsqueda.

EDITAR - Supongo que tiene dos modelos Project y Client : si no puede crear un nuevo controlador, puede crear la acción de búsqueda en su controlador actual.

def search #store all the projects that match the name searched @projects = Project.where("name LIKE ? ", "%#{params[:project]}%") #store all the clients that match the name searched @clients = Client.where("name LIKE ? ", "%#{params[:client]}%") end

Y que puede usar @projects y @clients en la vista de búsqueda.

Si intenta mostrar los resultados en otro lugar (por ejemplo, vista de index ), puede mover lo anterior a la acción correcta.

def index .... #store all the projects that match the name searched @projects = Project.where("name LIKE ? ", "%#{params[:project]}%") #store all the clients that match the name searched @clients = Client.where("name LIKE ? ", "%#{params[:client]}%") end

EDIT 2 - Está bien, está intentando buscar por una combinación de campos en el mismo modelo:

Usted y cambie su método de búsqueda para agregar estos dos campos:

def self.search(search_project, search_client) return scoped unless search_project.present? || search_client.present? where([''project_name LIKE ? AND client LIKE ?'', "%#{search_project}%", "%#{search_client}%"]) end

Pero ten en cuenta que || devolverá el alcance si su search_project O search_client no están presentes, puede cambiar para AND (&&) si lo prefiere.

Además, el AND regresará solo si ambos coinciden, me refiero a la combinación de búsqueda ... También puede cambiarlo a OR si lo desea.

Tener el formulario de búsqueda:

Su formulario de búsqueda:

<%= form_tag search_index_path, method: :get do %> <%= text_field_tag :project, params[:project] %> <%= text_field_tag :client, params[:client] %> <%= submit_tag "Search", name: nil %> <% end %>

Entonces su controlador debe enviar la combinación al modelo:

@project_search = Project.search(params[:project], params[:client]).all

Creo que resolverá el problema ...