Как я могу обновить свой вид отсортированными списками фильмов после нажатия кнопки в Rails? - PullRequest
0 голосов
/ 08 октября 2018

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

Вот моя модель list.rb, где я определил метод order_list:

  def order_list(sort_by)
    if sort_by == 'title' || sort_by.blank?
      self.movies.order(title: :asc)
    elsif sort_by == 'rating'
      self.movies.order(rating: :asc)
    else
      self.movies.order(created_at: :asc)
    end
  end

А вот мое действие контроллера для списков # show:

  def show
    @list.movies.order_list(params[:sort_by])
  end

Я также включил :sort_by в мои разрешенные параметры.

И, наконец, вот моя кнопка link_to в show.html.erb для моих списков:

<%= link_to "Sort By Title", list_path(sort_by: 'title'), class: 'btn btn-secondary btn-sm btn-space' %>

Мой show.html.erb:

<div class="container-fluid text-center">
  <h2><strong><%= @list.name %></strong></h2>
</div>

<div class="text-center">
  <h2><strong><% @list.average_rating.to_i.ceil.times do %></strong></h2>
    <span><%= fa_icon "star" %></span>
  <% end %>
</div>
<div class="container-fluid text-center">
  <span>
    <%= link_to "Sort By Title", list_path(@list.id, sort_by: 'title'), class: 'btn btn-secondary btn-sm btn-space' %>

    <button class="btn btn-sm btn-space btn-secondary" id="sort-ratings">Sort By Rating</button>
  </span>
</div>


<div class="card-deck text-center" id="card-deck">
  <% @list.movies.each do |m| %>
      <div class="card">
        <img src="<%= m.poster %>" alt="No poster found." class="card-img-top">

        <div class="card-body">
          <h5 class="card-title"><%= m.title %></h5>
          <p class="card-text"><%= m.genre %></p>
          <p class="card-text">Director: <%= m.director %></p>
          <p class="card-text"><%= m.plot %></p>
        </div>

        <div class="card-footer">
          Rating: <% m.rating.times do %>
            <span><%= fa_icon "star" %></span>
          <% end %>

          <div class="btn-top">
            <span class="btn-group">
              <%= button_to "Edit movie", edit_movie_path(m), method: 'get', class: 'btn btn-primary btn-sm btn-space' %>

              <%= button_to "Delete movie", movie_path(m), method: 'delete', controller: 'movies', class: 'btn btn-danger btn-sm btn-space', data: { confirm: "Are you sure?"} %>
            </span>
          </div>

        </div>
      </div>

  <% end %>
</div>

Идея состоит в том, что при нажатии кнопки sort_by: 'title' передается в мои параметры, а затем я вызываю метод order_list в моих фильмах вэтот список, а затем представление обновляется с отсортированным списком.На данный момент параметры выглядят хорошо при нажатии кнопки, но представление не обновляется.Что мне не хватает?Есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 08 октября 2018

При вызове помощника list_path необходимо передать идентификатор списка в качестве аргумента.См. документы .Допускаются дополнительные параметры, но после обязательных.

Изменение вашей ссылки на:

<%= link_to "Sort By Title", list_path(@list.id, sort_by: 'title'), class: 'btn btn-secondary btn-sm btn-space' %>

должно исправить это.

Другая проблема, в вашем контроллере вы вызываете order_list метод для movies коллекции списка, тогда как он определен для List самой модели.Я думаю, вам нужно изменить его на @list.order_list(params[:sort_by])

Еще одна вещь: вы вызываете метод order_list, но не используете его результат.Так отсортированные фильмы просто напрасны.Чтобы исправить это, вам нужно сохранить его в переменной экземпляра и повторно использовать в представлении:

@movies = @list.order_list(params[:sort_by])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...