Создание файлов cookie для параметров поиска? - PullRequest
2 голосов
/ 07 декабря 2011

Мне нужна помощь в создании этих файлов cookie для параметров поиска.Я прочитал Руководство по Rails и API , но все еще не понимаю, как правильно создавать файлы cookie.У меня есть два флажка, которые фильтруют результаты поиска.Они начинаются как уже проверено, но мне нужно сохранить настройки в куки, если один из них не проверен для следующих поисков.Вот картинка для лучшего понимания:

How it looks


Ответ:

class SearchController < ApplicationController
  def index
    @title = "Search"
    @page_title = "Search"
    # Checkboxes are already checked.
    params[:online_search_checked] = true
    params[:offline_search_checked] = true
    restore_cookie # if user enters this page in the future we restore checkboxes state from the cookies. For the first visit checkbox value will be true.
  end

  def results
    update_cookie # each time user submits search we need to update cookies.
    restore_cookie # each time user submits search we need to show search page with correctly checked check boxes.
    @title = "Search"
    @page_title = "Search"
    @search = Product.search do |q|
      q.fulltext params[:search]
      q.with(:coordinates, params[:coordinates]).near(latitude, longitude, :precision => 3) if params[:coordinates].present?
      q.with(:online_search, false) if params[:online_search].nil? # search user prices that are online automatically if checkbox is checked.
      q.with(:offline_search, true) if params[:offline_search].nil? # search user prices that are offline automatically if checkbox is checked.
      q.paginate(:per_page => 20, :page => params[:page])
      q.order_by(:purchase_date, :desc)
      q.order_by(:price,:asc)
    end
    @products = @search.results
  end

  def update_cookie
    update_cookie_with_param(:online_search, :online_search_checked)
    update_cookie_with_param(:offline_search, :offline_search_checked)
  end

  def restore_cookie
    restore_param_from_cookie(:online_search_checked)
    restore_param_from_cookie(:offline_search_checked)
  end

  def update_cookie_with_param(value_param_name, checked_param_name)
    checked = params[value_param_name].nil? ? "false" : "true"
    cookies[checked_param_name] = { :value => checked, :expires => 2.weeks.from_now }
  end

  def restore_param_from_cookie(checked_param_name)
    if cookies[checked_param_name]
      params[checked_param_name] = (cookies[checked_param_name] == "true")
    end
  end
end

# On index and result page in partial
<%= form_tag results_search_index_path, :method => 'get' do %>
   <%= text_field_tag :search, params[:search] %>
   <%= submit_tag "Search", :name => nil %>
   <%= label_tag :online_search, 'Online' %>
    <%= check_box_tag :online_search, 'online_search_value', params[:online_search_checked] %>
    <%= label_tag :offline_search, 'Offline' %>
    <%= check_box_tag :offline_search, 'offline_search_value', params[:offline_search_checked] %>
<% end %>

1 Ответ

1 голос
/ 11 декабря 2011

Cookie - это сообщение, переданное веб-браузеру веб-сервером. браузер сохраняет сообщение в текстовом файле. Затем сообщение отправляется вернуться на сервер каждый раз, когда браузер запрашивает страницу с сервер.

В рельсах вы можете использовать cookies, cookies.permanent и cookies.signed для записи cookie:

  • cookies - простые сеансовые куки
  • cookies.permanent - создать куки со сроком годности 20 лет в будущем
  • cookies.signed - генерировать подписанное представление cookie для предотвращения подмены его значения конечный пользователь.

Чтобы объяснить использование файлов cookie, я создал два сеансовых файла cookie для вашего приложения: «online_search_checked» и «offline_search_checked». Они содержат значения «истина» или «ложь» и показывают, установлен ли соответствующий флажок или нет.

check_box_tag имеет следующие параметры: checkbox_name, checkbox_value, is_checked. Нам нужно изменить третий параметр в зависимости от значения, полученного из куки. Второе значение может быть константой. Если флажок установлен, тогда params [: checkbox_name] == checkbox_value. Если флажок снят, то params [: checkbox_name] == nil.

Вот алгоритм:

  • В первый раз, когда пользователь нажимает «поиск / индекс», он не имеет Установлены файлы cookie «online_search_checked» и «offline_search_checked». Затем вы хотели бы показать ему оба флажка по умолчанию.
  • Если это не первый раз, тогда пользователь уже установил куки и нам нужно восстановить состояние флажков из этих файлов cookie.
  • Когда пользователь нажимает «Поиск / Результаты», мы обновляем куки с текущим состоянием флажков и восстановить состояние флажков из этих файлов cookie.

Вот код с моими комментариями:

class SearchController < ApplicationController
  def index
    params[:online_search_checked] = true
    params[:offline_search_checked] = true
    restore_cookie # if user enters this page in the future we restore checkboxes state from the cookies. For the first visit checkbox value will be true.
  end

  def results
    update_cookie # each time user submits search we need to update cookies
    restore_cookie # each time user submits search we need to show search page with correctly checked check boxes

    # Using Sunspot here.
    @search = Product.search do |q|
      q.fulltext params[:search]
      q.with(:online_search, params[:online_search] == 1) if params[:online_search].nil?
      q.with(:offline_search, params[:offline_search] == 0) if params[:offline_search].nil?
    end

    @products = @search.results # Sunspot rendering results.
  end

  def update_cookie
    update_cookie_with_param(:online_search, :online_search_checked)
    update_cookie_with_param(:offline_search, :offline_search_checked)
  end

  def restore_cookie
    restore_param_from_cookie(:online_search_checked)
    restore_param_from_cookie(:offline_search_checked)
  end

  def update_cookie_with_param(value_param_name, checked_param_name)
    checked = params[value_param_name].nil? ? "false" : "true"
    cookies[checked_param_name] = { :value => checked, :expires => 2.weeks.from_now }
  end

  def restore_param_from_cookie(checked_param_name)
    if cookies[checked_param_name]
      params[checked_param_name] = (cookies[checked_param_name] == "true")
    end
  end
end

# On index and result page in partial
<%= form_tag 'results', :method => 'get' do %>
   <%= text_field_tag :search, params[:search] %>
   <%= submit_tag "Search", :name => nil %>
   <%= check_box_tag :online_search, 'online_search_value', params[:online_search_checked] %>
   <%= check_box_tag :offline_search, 'offline_search_value', params[:offline_search_checked] %>
<% end %>

Надеюсь, это поможет!


UPDATE

Я не совсем понял, что вы хотите здесь делать:

q.with(:online_search, params[:online_search] == 1) if params[:online_search].nil?
q.with(:offline_search, params[:offline_search] == 0) if params[:offline_search].nil?

В вашем коде params[:online_search] == 1 и params[:offline_search] == 0 выражения всегда будут false, потому что params[:online_search] и params[:offline_search] равны nil в соответствии с if условием.

...