#ruby-on-rails #sorting #pagination
#ruby-on-rails #сортировка #разбивка на страницы
Вопрос:
В моем приложении rails я ограничиваю количество комнат, отображаемых на странице, с помощью разбивки на страницы, я хочу разрешить пользователю упорядочивать / сортировать результаты по разным столбцам модели комнаты. Я думаю, мне понадобится выпадающее меню, чтобы сделать это, а затем передать эти данные моему rooms_controller, возможно, через переменную экземпляра.
Как я могу отсортировать комнаты с помощью тега select в соответствии со столбцом и что мне нужно сделать в соответствующем контроллере, чтобы это сработало?
На данный момент я использую это для выпадающего меню:
index.html.erb
...
...
<%= will_paginate @rooms %>
<div id="order-by">
<select>
<option value="asc">Distance</option>
<option value="asc">Name</option>
<option value="asc">Price (low to high)</option>
<option value="des">Price (high to low)</option>
<option value="asc">Reviews</option>
</select>
</div>
rooms_controller.rb
...
...
def index
@rooms = Room.paginate :page => params[:page], :per_page => 12
end
...
Моя модель комнаты имеет listing_name: строка, адрес: строка, nightly_price: целое число и имеет множество отзывов. Моя обзорная модель принадлежит комнате. Я использую geocoder gem для определения местоположения комнаты.
Я искал allot и перепробовал несколько способов заставить это работать, и я не могу разобраться с этим. Я был бы очень рад любым подсказкам о том, как это решить! Если вам нужна дополнительная информация, просто дайте мне знать.
Комментарии:
1. Вы хотите упорядочить элементы только на странице или все записи в Room? Если вы хотите упорядочить все записи, вы можете либо обновить страницу, либо загрузить значения с помощью ajax.
Ответ №1:
Что-то вроде:
index.html.erb
<%= will_paginate @rooms %>
<div id="order-by">
<form>
<select name="sort">
<option value="distance">Distance</option>
<option value="name">Name</option>
<option value="price">Price (low to high)</option>
<option value="price desc">Price (high to low)</option>
<option value="review">Reviews</option>
</select>
<input type="submit" value="Sort"/>
</form>
</div>
rooms_controller.rb
def index
@rooms = Room.order(params[:sort]).paginate(page: params[:page], per_page: 12)
end
Также необходимо убедиться, что params[:sort]
включено только в доступные значения,
например:
sort = params[:sort]
sort = nil unless sort.in?(['distance', 'name', 'price', 'price desc', 'review'])
@rooms = Room.order(sort).paginate(page: params[:page], per_page: 12)
Рассмотрите возможность использования отдельной области для сортировки или какого-либо драгоценного камня. например, ransack
Комментарии:
1. Большое вам спасибо!!! Это помогло мне выделить! Мне все еще нужно выяснить, как выполнить сортировку в соответствии с «моделью отзывов», в которой есть два столбца «комментарий: текст» и «звезды: целое число», и я должен выяснить, как обойти геокодер gem и «расстояние». Но наконец-то у меня есть отправная точка! Еще раз спасибо! Это сводило меня с ума! 😉