ROR學習筆記(37)——查詢&查詢后的排序(非ajax)

昨天用自己的方法實現(xiàn)了排序,所以想“得寸進尺”實現(xiàn)查詢。不過還是找了一個資料才成功=。=|

  1. routes修改一下:
  resources :products do
    collection do
      get 'search'
    end
  end
  1. views中增加:
  <%= form_tag "/products/search", method: "get" do %>
  <%= label_tag :s_price, "Price" %>
  <%= text_field_tag :s_price %>
  <%= submit_tag "Search" %>
  <% end %>
  1. controller中增加:
  def search    
    if params[:s_price] == ""
      redirect_to :back
    else
      query = "price like \'%s\'" % params[:s_price]
      @products = Product.where(query).paginate(page: params[:page], per_page: 12)
      render 'index'
    end    
  end

這樣就實現(xiàn)了對價格的查詢
但有一個問題:查詢完后,點擊表頭想對查詢后的結(jié)果進行排序時,又重新查詢了一遍所有的products然后再進行排序。
想了很多“招”,最開始是用request.referer來判斷如果是從查詢結(jié)果頁面跳轉(zhuǎn)到排序頁面,那么就把查詢結(jié)果頁面的url中的查詢條件解析出來,查詢后再進行排序。“Bingo!",點了一下排序,居然成功了!還以為自己超給力,結(jié)果第二次排序的時候,又變成了對所有products的查詢了,原因就是:當進行了一次排序后,再進行排序request.referer不是查詢頁面了, 而是排序頁面。所以出錯。
OK,再想想有沒有其它的方法。
突然之間,我想到了用cookies來存放查詢語句,先試一下:所以代碼寫成了這樣:
controller中:

  def index
    @products = Product.all.paginate(page: params[:page], per_page: 12)
    query = "1 = 1"
    cookies[:query] = query
  end
  def sort_by
    query = cookies[:query]
    if @order[:p_by].include?(params[:sort_id])
      order_change(@order, params[:sort_id])
      @products = Product.where(query).order("%s %s" % params[:sort_id].split("_")[1..2])
      @products = @prdutcs.paginate(page: params[:page], per_page: 12)
      respond_to do |format|
        format.html {render 'index'}       
      end
    else
      redirect_to root_path
    end
  end
  def search    
    if params[:s_price] == ""
      redirect_to :back
    else
      query = "price like \'%s\'" % params[:s_price]
      @products = Product.where(query).paginate(page: params[:page], per_page: 12)
      cookies[:query] = query
      render 'index'
    end    
  end

這次果然成功了!!
但又有一個問題,因為通過cookies的話,必然把數(shù)據(jù)庫的列名暴露無遺,而我又想不到其它辦法來處理,所以想到把cookies[:query]進行加密,controller中最終代碼如下

def index
    @products = Product.all.paginate(page: params[:page], per_page: 12)
    query = "1 = 1"
    cookies[:query] = encode(query)
  end
  def sort_by
    query = decode(cookies[:query])
    if @order[:p_by].include?(params[:sort_id])
      order_change(@order, params[:sort_id])
      @products = Product.where(query).order("%s %s" % params[:sort_id].split("_")[1..2])
      @products = @products.paginate(page: params[:page], per_page: 12)
      respond_to do |format|
        format.html {render 'index'}       
      end
    else
      redirect_to root_path
    end
  end
  def search    
    if params[:s_price] == ""
      redirect_to :back
    else
      query = "price like \'%s\'" % params[:s_price]
      @products = Product.where(query).paginate(page: params[:page], per_page: 12)
      cookies[:query] = encode(query)
      render 'index'
    end    
  end
  private
    def encode(string)
      Base64.encode64(Digest::SHA1.hexdigest("tangxiaoyonghaoshuai") + string)
    end
    def decode(string)
      Base64.decode64(string)[40..-1]
    end

感覺勉強可以。。。以后學到新的東西再來更新。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容