rails视图按各种类别排序模型

Posted

技术标签:

【中文标题】rails视图按各种类别排序模型【英文标题】:rails view sort model by various category 【发布时间】:2014-04-23 03:50:09 【问题描述】:

在我的艺术家索引中,我有这段代码允许用户搜索艺术家,然后页面将只显示结果而不是所有艺术家。

<%= form_tag(artists_path, :method => "get", id: "search-form") do %>
      <%= text_field_tag :search, params[:search], placeholder: "Search Artists" %>
      <%= submit_tag "Search", :name => nil %>
<% end %>

这很有效,因为在我的控制器中我有:

def index
    if params[:search]
        @artists = Artist.search(params[:search].titleize).order("created_at DESC")
    else
        @artists = Artist.all.order(:name)
    end
end

但是现在我想在我的视图中添加按钮以按其他类别排序,例如最高平均分、最多评论等。执行此操作的最佳方法是什么,类似于我做表单的方式,以便当他们点击它会将参数折腾到控制器中的索引并重新加载页面的链接?

【问题讨论】:

可能是您要过滤搜索结果的选项,可以作为选择选项给出,选择过滤选项后点击搜索,也可以发送到控制器的索引方法并显示基于此的结果。 我会实现一个只搜索艺术家姓名的基本搜索和一个包含更多选项的高级搜索。在高级搜索中,您可以使用下拉菜单、滑块或其他任何东西来使搜索任何内容变得轻而易举。所有参数都将发送到您的控制器。但是,我不会在您的索引操作中实现高级搜索功能。我更喜欢使用模块、关注点或普通的旧 ruby​​ 对象来保持控制器的精简。 【参考方案1】:

首先让我们稍微重构一下这段代码并添加更改:

class Article < ActiveRecord::Base
  scope :search, ->(keyword) where('name ilike ?', "%#keyword.titleize%") if search.present?
end

def index
  params[:order] =  params[:search] ? :created_at : (params[:order] || :name)
  @artists = Artist.search(params[:search]).order("#order_column DESC")
end

在您的视图中,如果您显示列名,则在每个列名旁边显示一个用于排序的箭头,单击它会将排序切换为该列的 desc 或 asc,如果您的视图中没有列名,则添加带有列名称的选择下拉列表,并在更改时提交表单:

<%= form_tag(artists_path, :method => "get", id: "search-form") do %>
  <%= text_field_tag :search, nil, placeholder: "Search Artists" %>
  <%= select_tag :order, options_for_select([ ['Created At', :created_at],  ['Name', :name ], :name) %> 
  <%= submit_tag "Search", :name => nil %>
<% end %>

【讨论】:

以上是关于rails视图按各种类别排序模型的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails 中一个共享视图的两个控制器

在视图中呈现现有类别,rails

创建不需要模型的 Rails 视图 + 控制器?

Rails 5 - 在不同的URL上呈现2个不同的发布顺序

如何在 Rails 2.3 中的 .each 循环中排序

Mongoid Rails 4 按 asc 或 desc order created_at 排序