2016-11-15 2 views
0

У меня есть сайт для просмотра/обсуждения книг и вы хотите заказать все книги пользователей на странице своего профиля, основываясь на том, что они сейчас читают эту книгу. Я добавил колонку в модель книги, которая называется current, и когда пользователи добавляют книгу, они могут проверить поле, в котором говорится: «Я сейчас читаю это». Если пользователь нажимает на поле, тогда у объекта книги есть атрибут: current со значением «1». Если они не нажимают на поле, то значение: current равно «0».сортировать по атрибуту модели в контроллере в пользовательском шоу

На мой взгляд, у меня есть этот код, чтобы рассказать пользователю, какие книги они в настоящее время читают, и он отлично работает.

 <% if book.current == "1" %> 
     <h4>I am currently reading this book</h4> 
     <% end %> 

Однако в контроллере моего дисплея я не могу заставить его заказывать объекты, связанные с: текущим статусом.

Вот что я пробовал:

def show 
    @user = User.find_by_id(params[:id]) 
    @books= Book.all.sort { |p1, p2| p1.current <=> p2.current } 
end 

и

def show 
    @user = User.find_by_id(params[:id]) 
    @books = Book.all 
    @books = @books.order(:current) 
end 

и

def show 
    @user = User.find_by_id(params[:id]) 
    @books = Book.all 
    @books = @books.order(current: :desc) 
end 

и, просто чтобы убедиться, что он идет в правильном направлении

def show 
    @user = User.find_by_id(params[:id]) 
    @books = Book.all 
    @books = @books.order(current: :asc) 
end 

Отсутствует работа. И, никто не бросает ошибок, они просто не сортируют его. «Текущая» книга, которая является последней, а не первой. Вот код, который отображает и отбирает книги пользователей. Этот код также отлично работает.

<% @user.books.each do |book| %> 
    <% if params[:id].to_s == book.user_id.to_s %> 
    <ul class="profileDisplay" > 

     <img alt="Book Jacket" class="homepageImages" src=<%= book.image %> > 
     <% if book.current == "1" %> 
     <h4>I am currently reading this book</h4> 
     <% end %> 
     <p><b>Contributor: </b><%= book.user.name %></p> 
     <p><b>Title: </b><%= book.title %></p> 
     <p><b>Author: </b><%= book.author %></p> 
     <p><b>Genre: </b><%= book.genre %></p> 
     <p><b>Publication Date: </b><%= book.publication_date %></p> 
     <p><b>Publisher: </b><%= book.publisher %></p> 
     <p><b>Synopsis: </b><%= book.synopsis %></p> 
     <% if params[:id] == session[:user_id].to_s || params[:action] == "profile" %> 
     <%= button_to "Edit Book", book_edit_path(book.id), method: "get", class: "btn btn-primary col-xs-2" %> 
     <%= button_to "Delete Book", delete_book_path(book.id), method: :delete, data: {confirm: "Are you sure you want to delete this book and all it's reviews?"}, class: "btn btn-danger col-xs-2" %> 
     <% end %> 
    </ul> 
    <% end %> 
<% end %> 

ответ

2

На вид, @user.books еще не отсортированы.

Вы отсортирован их и назначил его в @books

Я думаю, что это должно быть, как это

CONTROLLER

def show 
    @user = User.find_by_id(params[:id]) 
    @books = @user.books.order(current: :desc) 
end 

VIEW

<% @books.each do |book| %> 
    <!-- show book records here --> 
<% end %> 
+0

работал! спасибо, и с этим таким образом я могу заставить пользователя проверить вид, который я пытался реализовать, когда я это сделал, но не мог понять. Еще раз спасибо! – nwimmer123

0

добавить область применения по умолчанию в книге модели

default_scope { order(:current=> :desc) } 

и ваш контроллер

@user = User.find_by_id(params[:id]) 

и просмотров

<% @user.books.each do |book| %> 
    #do whatever 
<% end %> 
Смежные вопросы