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
условием.