3

总的来说,我对 Rails、数据库和 Web 开发非常陌生,现在我的功能正在运行,但我 100% 确定这不是最干净或最 Ruby-esq 的方式。基本上我想使用两个单独的链接,按不同的列对同一个表进行排序,而不使用两个控制器操作和两个视图。我宁愿只使用一个带有参数的索引操作,该参数指示如何对返回的数据进行排序。

电流控制器:

Controller

def index
  @casinos = Casino.order('name ASC')
end

def casinos_by_region
  @casinos = Casino.order('location ASC')
end

和视图中的链接

 %h3 Sort by:
 = link_to 'Name', casinos_path
 %br
 = link_to 'Location', casinos_by_region_path

我阅读了文档,但没有看到使用 link_to 路径将参数从视图传递到控制器的明显方法?我知道我可以通过其他方式做到这一点,但我拒绝相信我不能以这种方式做到这一点。对不起这个愚蠢的问题!

4

2 回答 2

6

对 CDub 竖起大拇指。只是为了增强它,您可能希望通过确保 params[:sort_param] 包含预期值来增加排序的安全性,以防有人决定键入 url。下面的代码不仅可以确保您获得了可接受的排序键,而且还为首次访问 url 提供了默认值。

def index
  params[:sort_param] = %w{name location}.include?(params[:sort_param]) ? params[:sort_param] : 'name'
  @casinos = Casino.order "#{params[:sort_param]} ASC"
end
于 2013-11-14T03:15:06.797 回答
4

这个怎么样:

def index
  @casinos = Casino.order("#{params[:sort_param]} ASC")
end


%h3 Sort by:
= link_to 'Name', casinos_path(:sort_param => "name")
%br
= link_to 'Location', casinos_path(:sort_param => "location")

中的路径link_to可以采用哈希,它是请求的参数。sort_param您可以使用要排序的值设置参数(在本例中),然后order在控制器的 index 方法中使用它。

于 2013-11-14T03:06:39.970 回答