在我的艺术家索引中,我有这个代码,允许用户搜索艺术家,然后页面将只显示结果,而不是所有艺术家。
<%= 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
但是现在我想在我的视图中添加按钮以按其他类别排序,例如最高平均分数,大多数评论等。这样做的最佳方式类似于我如何处理表单,所以当他们点击链接时,它会将一个参数扔进控制器中的索引并重新加载页面?
答案 0 :(得分:0)
首先让我们重构一下这段代码并添加更改:
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 %>