如何使用按钮更新已过滤类别的顺序?

时间:2016-03-13 19:27:17

标签: ruby-on-rails ruby-on-rails-4

我是Rails的新手,但正在慢慢取得进展。我无法完全掌握如何完成下一个任务。

我有一个控制器(IdeasController),其索引如下所示:

def index

 if params[:round].blank? && params[:challenge].blank?
   @ideas = Idea.all.order(params[:sort])
 # @ideas = Idea.all.order(created_at: :desc, cached_votes_up: :desc)
 end

 if params[:round].present?
  @round_id = Round.find_by(name: params[:round]).id
  @ideas = Idea.where(round_id: @round_id).order("created_at DESC")
 end

 if params[:challenge].present?
   @challenge_id = Challenge.find_by(name: params[:challenge]).id
   @ideas = Idea.where(challenge_id: @challenge_id).order("created_at DESC")
 end

end

我正在使用以上内容更新视图并按类别过滤:round和:使用我的index.html.erb中的代码进行挑战:

<%= link_to "All", ideas_path %>
<% Round.all.each do |round| %>
  <%= link_to round.name, ideas_path(round: round.name) %>
<% end %>
<% Challenge.all.each do |challenge| %>
  <%= link_to challenge.name, ideas_path(challenge: challenge.name) %>
<% end %>

现在,我的问题是我想创建一个按created_at DESC或ASC排序的按钮。我希望按钮基本上是一个切换。我还想通过cached_weighted_average DESC或ASC订购另一个按钮。这是来自acts_as_votable,所以我可以按投票计数排序。

我遇到的问题是我可以创建一个按created_at或cached_weighted_average排序的链接或按钮,但它会替换先前通过以下方式过滤的所有URL:round或:challenge。例如,如果用户点击&#34;第1轮&#34;并看到标记为&#34;第1轮和第34天的所有想法;然后他们点击链接按cached_weighted_average排序,URL替换:

/ideas?round=Round+1

有了这个:

/ideas?sort=cached_weighted_average+ASC

我想要的是:

/ideas?round=Round+1&?sort=cached_weighted_average+ASC

我知道这是一个非常新的问题,但到目前为止我所尝试的一切都失败了。感觉我错过了很简单的事情。我注意到我可以轻松做到的是控制器里面我可以做的事情:

if params[:round].present?
  @round_id = Round.find_by(name: params[:round]).id
  @ideas = Idea.where(round_id: @round_id).order("cached_weighted_average DESC")
end

哪个是完美的。此按钮只需在cached_weighted_average DESC和created_at DESC之间切换。

感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

传递多个参数是一种处理方式:

 <%= link_to object.name, object_path(first: something, second: something_else) %>

然后改变你的条件,考虑存在多个参数。

在尝试允许用户选择他们如何排序的方式来区分轮次和挑战时,您可以使用相同的名称然后将其传递给不同的值。

类似的东西:

 params["round_or_challenge"]

这会将您的条件更改为:

 if params["round_or_challenge"] == "round" && params["asc_or_desc"] == "asc"
   # query
 elsif params["round_or_challenge"] == "challenge"
   # query 
 end

或其他什么。它基本相同......只需传递你需要的值。您也可以从视图中传递现有参数,就像在控制器中访问它们一样。

答案 1 :(得分:0)

感谢您的回复,@ toddmetheny。我没有实现您的解决方案,但您的解决方案帮助我了解了多个参数的传递。

我最终创建了一个可排序的帮助器。我还使用了url_for来追加当前URL的末尾。我喜欢这种方法,因为这意味着我可以对任何参数进行排序。我不确定它是最好的解决方案,但它确实有效。

def sortable (name, sort)
    link_to name, url_for(params.merge(sort: sort))
end