【问题标题】:Rails search form with radio buttons to select search conditonsRails 搜索表单,带有单选按钮以选择搜索条件
【发布时间】:2012-06-19 22:44:02
【问题描述】:

我在我的应用中实现了一个简单的 Rails 搜索。在我这样做的时候,我只需要完成工作,但是我确信我做的方式远非 DRY,所以任何关于如何改进它的建议都将不胜感激。我基本上想要一个搜索文本框,带有 4 个单选按钮,用户可以选择它们来选择他们想要搜索的内容。

我目前的索引:

<%= form_tag("/search", :method => "get") do %>
  <%= label_tag(:q, "Search for Product Title:") %>
  <%= text_field_tag(:q) %>
  <%= submit_tag("Search Title") %>
<% end %>
<br>
<%= form_tag("/search", :method => "get") do %>
  <%= label_tag(:d, "Search for Product Description:") %>
  <%= text_field_tag(:d) %>
  <%= submit_tag("Search Description") %>
<% end %>
<br>
<%= form_tag("/search", :method => "get") do %>
  <%= label_tag(:a, "Search for Category Names:") %>
  <%= text_field_tag(:a) %>
  <%= submit_tag("Search Category Name") %>
<% end %>
<br>
<%= form_tag("/search", :method => "get") do %>
  <%= label_tag(:i, "Search for ID Str:") %>
  <%= text_field_tag(:i) %>
  <%= submit_tag("Search ID Str") %>
<% end %>

<<results from search here>>

控制器:

class SearchController < ApplicationController

  def index
    if params[:commit] == "Search Title"
      # Great, now lets figure out what sort of query we're after
      @searchQuery_title = params[:q]
      @resultsReceived_title = true
      if 
         @sqlResults_title_published_size = Product.where("title like ? AND published like ?", "%" + params[:q] + "%", '1')
         @sqlResults_title_size = Product.where("title like ? OR categories like ?", "%" + params[:q] + "%", "%" + params[:q] + "%")
         @sqlResults_title = Product.where("title like ? OR categories like ?", "%" + params[:q] + "%", "%" + params[:q] + "%").page(params[:page]).per(200).order("published DESC")
      end
    else
      @resultsReceived_title = false
      @sqlResults_title = []
    end

     if params[:commit] == "Search Description"
        # Great, now lets figure out what sort of query we're after
        @searchQuery_descr = params[:d]
        @resultsReceived_descr = true
        if 
           @sqlResults_descr_published_size = Product.where("long_descr like ? AND published = ?", "%" + params[:d] + "%", '1')
           @sqlResults_descr_size = Product.where("long_descr like ?", "%" + params[:d] + "%")
           @sqlResults_descr = Product.where("long_descr like ?", "%" + params[:d] + "%").page(params[:page]).per(200).order("published DESC")
        end
      else
        @resultsReceived_descr = false
        @sqlResults_descr = []
      end

      if params[:commit] == "Search Category Name"
          # Great, now lets figure out what sort of query we're after
          @searchQuery_cat = params[:a]
          @resultsReceived_cat = true
          if 
             @sqlResults_cat_published_size = Product.where("category_names like ? AND published = ?", "%" + params[:a] + "%", '1')  
             @sqlResults_cat_size = Product.where("category_names like ?", "%" + params[:a] + "%")
             @sqlResults_cat = Product.where("category_names like ?", "%" + params[:a] + "%").page(params[:page]).per(200).order("published DESC")
          end
        else
          @resultsReceived_cat = false
          @sqlResults_cat = []
        end

        if params[:commit] == "Search ID Str"
            # Great, now lets figure out what sort of query we're after
            @searchQuery_idstr = params[:i]
            @resultsReceived_idstr = true
            if 
               @sqlResults_idstr_published_size = Product.where("id_str like ? AND published = ?", "%" + params[:i] + "%", '1')  
               @sqlResults_idstr_size = Product.where("id_str like ?", "%" + params[:i] + "%")  
               @sqlResults_idstr = Product.where("id_str like ?", "%" + params[:i] + "%").page(params[:page]).per(200).order("published DESC")
            end
          else
            @resultsReceived_idstr = false
            @sqlResults_idstr = []
          end

    # Render the page when we're done.
    respond_to do |format|
      format.html
    end

  end
end

也可以做一个 Product.where("title like ? OR categories like ? AND published = ?", "%" + params[:q] + "%", " %" + params[:q] + "%", '1').page(params[:page]).per(200).order("published DESC")

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1


    【解决方案1】:

    表格 4个表格是多余的。实现单选按钮直接发送,表单参数为:in,搜索词为:q

    <%= form_tag("/search", :method => "get") do %>
      <%= label_tag(:q, "Search:") %>
      <%= text_field_tag(:q) %>
      <% [ 'product title', 'product description', 'categories', 'ID string' ].each do |in| %>
        <br>
        <%= radio_button_tag 'in', in %>
        <%= in.humanize %>
      <% end %>
      <%= submit_tag("Search") %>
    <% end %>
    

    如果您坚持在每种搜索类型中放置不同的按钮文本,请在单选按钮上使用 javascript 挂钩来更改它。

    控制器。 将搜索抽象为模型中的命名范围(见下文)。由于每种类型的搜索都收集相同的产品模型实例,因此最佳做法是在 Product 上定义整个搜索范围。然后你的控制器看起来像:

    def index
      @result_scope = Product.search(params[:in],params[:q])
      @results = @result.page(params[:page]).per(200).order("published DESC")
      @results_size = @result.count
      @results_published_size = @result.published.size
    end
    

    我省略了resultreceived 等变量,因为可以在知道params[:in] 的视图中计算出来。为此使用辅助方法,然后在索引视图模板中调用它。你也可以通过这个来了解@results 中放入了哪个结果集合。 (如果您根本需要知道,因为无论我如何搜索结果产品,您都可能以相同的方式呈现结果产品。)所以我只使用一个变量将结果传递给视图。

    如果您使用rails默认渲染并且您的视图模板具有正确的路径(这称为隐式渲染),则该部分在操作中是不必要的:

    # Render the page when we're done.
    respond_to do |format|
      format.html
    end
    

    型号

    class Pruduct < ActiveRecord::Base
      # ...
      scope :search, lambda { |q,in|
        #...
      }
      scope :published, where(published: true)
    end
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多