2016-12-21 3 views
1

У меня есть контроллер, который управляет списком Post, и я добавил в него фильтр. Посты имеют rating (0-5 баллов). Фильтр позволяет пользователю вводить оценку, которую они хотят видеть, и отображает введенный рейтинг и выше.Как обновить переменную контроллера Rails на странице обновления?

Например, у меня есть 10 сообщений, а 7 из них имеют рейтинг 3.5 и выше. Если пользовательские входы 3.5 в рейтинге фильтр, он отображает только 7 сообщений с соответствующей оценкой.

Вот код:

index.html.erb

... 
<%= form_tag posts_path, method: :get, class: "form-inline" do %> <!-- form_tag on posts path (index), use get method since we are displaying results and not altering/ submitting new data --> 
    <div class="rating form-group"> 
    <%= label_tag :rating %> 
    <%= number_field_tag :rating, params[:rating], step: 0.5, min: 0, max: 5, class: "form-control" %> 
    <%= submit_tag "Search", name: nil, class: "btn btn-primary"%> 
    </div> 
<% end %> 
... 

Вот мой индекс:

def index 
    @posts = Post.all 
    @posts = Post.where("rating >= ?", params["rating"]) if params["rating"].present? 
end 

Моя проблема, я хочу, чтобы дать пользователям легкость удаления фильтра, когда они обновить страницу. Как я могу удалить фильтр каждый раз, когда пользователь обновляет страницу, чтобы снова отобразить все 10 сообщений? Прямо сейчас, если я хочу снова отобразить все 10 сообщений после создания фильтра, мне нужно либо перейти в поле поля, либо удалить номер 3.5, который я ввел ранее, и повторно отправить форму, или мне нужно вручную изменить URL-адрес от http://localhost:3000/posts?utf8...&rating=3 до http://localhost:3000/posts; Я думаю, было бы удобнее для пользователей просто обновлять страницу.

Я думаю, я могу перефразировать его как, как я могу изменить свой контроллер от @posts = Post.where... до @posts = Post.all еще раз, когда пользователь обновит страницу?

+0

Поскольку 'rating' получает передается в URL, и обновление будет включать в себя тоже (как вы отмечаете). Если вы слишком творчески меняете свой URL с условными обозначениями, вы попадаете на некоторую болотистую территорию управления государством. Легкое обходное решение: как насчет добавления кнопки «Очистить фильтры»? Он просто представляет вашу форму фильтра без параметра «рейтинг». – anyarms

+0

@Iggy, я удалил свой ответ, потому что вам потребуется изменить форму на запрос на отправку. Вам это нужно, чтобы получить запрос? – chester

+0

@chester, это не обязательно. Я рассмотрю все варианты, если он достигнет аналогичного результата! Большое спасибо :) – Iggy

ответ

1

Я не знаю, что вы маршруты, но давайте предположим, ваш posts_path является posts/index и маршруты к методу index в PostsController.

Во-первых, я хотел бы изменить маршруты конфигурации, так что post/index будет соответствовать методу index в PostsController для обоих :get и :post запросов:

# config/routes.rb 
match 'posts/index' => 'posts#index', as: 'posts', via: [:get, :post] 

Далее, я хотел бы изменить свою форму, чтобы использовать :post метод вместо :get:

<%= form_tag posts_path, method: :post, class: "form-inline" do %> 
    <div class="rating form-group"> 
     <%= label_tag :rating %> 
     <%= number_field_tag :rating, params[:rating], 
          step: 0.5, min: 0, max: 5, class: "form-control" %> 
     <%= submit_tag "Search", name: nil, class: "btn btn-primary"%> 
    </div> 
<% end %> 

Наконец, я хотел бы изменить, где положение контроллера, чтобы принять params[:rating] если это предусмотрено, но по умолчанию 0, если params[:rating] является nil:

def index 
    @posts = Post.where("rating >= ?", params[:rating]||=0) 
end 

Это, конечно, при условии, что у вас нет отрицательно рейтингу сообщения ... если вы делаете, вы можете по умолчанию достаточно отрицательного числа (что все должности оцениваются выше).

Теперь, когда пользователь отправляет форму, у url больше не будет params[:rating] в строке запроса.

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

0

Проблема заключается в том, что ваша строка запроса сохраняется при обновлении страницы.

Таким образом, один из способов сделать это - заменить URL-адрес и удалить строку запроса. С помощью history APi в современных браузерах вы можете это сделать.

history.replaceState({}, 'some title', '/'); 

Вы можете просто подключить это к вашему обратному сигналу в документе/голове. Таким образом, после того, как ваш пользователь получит ответ с рейтингами, вы измените URL-адрес обратно на строку без строки запроса. Поэтому, когда он обновляется, он запрашивает ваш сервер без строки запроса рейтинга.

Но имейте в виду, что ваш пользователь не сможет закладок вашей страницы по рейтингам. Если вы хотите это сделать, вам нужно будет переключить запрос на отправку, чтобы отправить запрос. Для получения дополнительной информации просмотрите эту страницу вики.

https://en.wikipedia.org/wiki/Post/Redirect/Get