首页 > 解决方案 > 重新排列分类显示页面中显示的专辑顺序

问题描述

好的,这会有点啰嗦,所以请耐心等待。

我的专辑索引页面显示了我所有的专辑,我可以根据创建时间等重新排序。我这样做的代码如下(只是忽略了一些东西被注释掉了,我还没有弄清楚如何做每周的最高喜欢和历史最高喜欢,但那是另一个帖子的另一个问题)

# album.rb
    scope :latest, -> { order(created_at: :desc) }
    #scope :weekly,    -> { order(likes: :desc) }
    #scope :alltime,   -> { order(likes: :desc) }

    def self.sort_by(sort_param)
        case sort_param
        when 'latest'
            latest
        #when 'weekly'
            #weekly
        #when 'alltime'
            #alltime
        else
            latest
        end
    end
#album controller
  def index
    @albums = Album.sort_by(params[:order])
  end
#album index
<table>
  <tbody>
    <%= link_to "Latest", albums_path(order: :latest) %><br>
    <%= link_to "Weekly Top", albums_path(order: :weekly) %><br>
    <%= link_to "All-Time Top", albums_path(order: :alltime) %>
  </tbody
</table>

<table>
  <tbody>
    <% @albums.each do |album| %>
      <tr>
        <td><%= link_to album.name, album %></td>
        <td><%= link_to image_tag(album.cover_image.variant(resize: "200x200")), album %></td>
        <td><%#= album.videos #%></td>
      </tr>
    <% end %>
  </tbody>
</table>

好的,就像我的帮助一样,一切都按预期工作,并根据选择的任何链接更改专辑索引页面中专辑的顺序……现在到我的实际问题上,我将所有专辑都绑定到一个类别。当我进入我的类别并选择一个时,它会将我带到该类别的类别显示页面并显示属于该特定类别的所有专辑,太棒了!现在我正在苦苦挣扎的是如何像在上面的专辑索引页面中那样重新排序类别显示页面中的专辑?

我尝试了几种不同的组合,但无法使其发挥作用。这是我到目前为止所拥有的

#category.rb
    scope :latest, -> { order(created_at: :desc) }
    #scope :weekly,    -> { order(likes: :desc) }
    #scope :alltime,   -> { order(likes: :desc) }

    def self.sort_by(sort_param)
        case sort_param
        when 'latest'
            latest
        #when 'weekly'
            #weekly
        #when 'alltime'
            #alltime
        else
            latest
        end
    end
#category controller
  def show
    @categories = Category.sort_by(params[:order])
  end
#category show
<table>
  <tbody>
    <%= link_to "Latest", categories_path(order: :latest) %><br>
    <%= link_to "Weekly Top", categories_path(order: :weekly) %><br>
    <%= link_to "All-Time Top", categories_path(order: :alltime) %>
  </tbody
</table>

<table>
    <tbody>
    <% @category.albums.map.each do |album| %>
        <tr>
            <td><%= link_to album.name, album %></td>
            <td><%= link_to image_tag(album.cover_image.variant(resize: "200x200")), album %></td>
        </tr>
    <% end %>
    </tbody>
</table>

所以我很确定我在类别控制器部分以及我在显示页面中调用的路径都错了。

我什至不确定我是否必须将代码放在类别模型中,或者我是否能够从专辑模型中调用代码,因为我试图在类别显示页面中重新排序专辑。

对此的任何建议将不胜感激。提前致谢。

标签: htmlruby

解决方案


假设这likes是一个整数列:

为了获得本周创建的专辑和类别,您需要定义如下范围:

scope :weekly, -> { where("created_at <= ?", DateTime.current.beginning_of_the_week) }
scope :latest,    -> { order(created_at: :desc) }
scope :by_likes,    -> { order(likes: :desc) }

请注意,“每周”实际上并不是一个订单,而是一个过滤器。当你不应用它时,你会得到“所有的时间”。

现在在视图中您可以执行以下操作:

    <%= link_to "Latest", categories_path(order: :latest) %><br>
    <%= link_to "Weekly Top", categories_path(weekly: true, order: :by_likes) %><br>
    <%= link_to "All-Time Top", categories_path(order: :by_likes) %>

和专辑的类比事物。

现在在控制器中您可以执行以下操作:

# categories controller
  def show
    @categories = Category.find(params[:id])

    @albums = @category.albums

    @albums = @albums.weekly if params[:weekly]

    @albums = @albums.by_likes if params[:order] == "by_likes"
    @albums = @albums.latest if params[:order] == "latest"
  end
# albums controller
  def index
    @albums = Album.all

    @albums = @albums.weekly if params[:weekly]

    @albums = @albums.by_likes if params[:order] == "by_likes"
    @albums = @albums.latest if params[:order] == "latest"
  end

然后你可以@albums像这样在类别显示视图中使用变量:

@albums.each do |album|

推荐阅读