我是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之间切换。
感谢任何帮助,谢谢。
答案 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