Rails 3:可排序列

时间:2011-08-09 23:59:52

标签: ruby-on-rails-3 sorting

我在Rails 3.0.5和ruby 1.9.2p180中关注Railscast#228。

除了将类名从Product更改为Player之外,我已逐字逐句地复制了代码。我也正在跳过Ryan添加箭头以表示排序方向的最后一部分。我能够加载正确的索引页面并查看所需的所有URL以及所需的参数(方向和排序),但点击时实际上没有发生任何事情。 URL正在更改,但页面未重新加载。

这是我的代码:

ApplicationHelper

  def sortable(column, title = nil)  
    title ||= column.titleize  
    direction = (column == params[:sort] && params[:direction] == "asc") ? "desc" : "asc"  
    link_to title, :sort => column, :direction => direction  
  end

PlayersController

  def index
    @players = Player.order(sort_column + ' ' + sort_direction)
  end

  private

  def find_team
    session[:team] ||= Team.new
  end

  def sort_column  
    Player.column_names.include?(params[:sort]) ? params[:sort] : "name_e"  
  end  

  def sort_direction  
    %w[asc desc].include?(params[:direction]) ?  params[:direction] : "asc"  
  end

感谢您的帮助!

编辑:根据要求,HTML代码。你可以看到Position的链接当前是desc,就像我在http://localhost:3000/players?direction=asc&sort=abb_pos。但是,此列或任何其他列都没有实际排序。

<th><a href="/players?direction=asc&amp;sort=name_e">Name</a></th> 
<th><a href="/players?direction=asc&amp;sort=team_e">Team</a></th> 
<th><a href="/players?direction=desc&amp;sort=abb_pos">Position</a></th> 
<th><a href="/players?direction=asc&amp;sort=height">Height</a></th> 
<th><a href="/players?direction=asc&amp;sort=weight">Weight</a></th>

2 个答案:

答案 0 :(得分:1)

我建议先做这件事:

def index
  order = sort_column + ' ' + sort_direction
  puts "-- order:'#{order}'"
  ...
end

单击链接,然后在服务器控制台中查找“ - ”输出。很可能在某处存在逻辑缺陷,使得实际编译的ORDER子句始终相同。链接本身看起来完全没问题。除非某处的链接中有#个字符,否则所有点击都应该有效(即浏览器应重新加载内容)。

对于一般的问题,有一个名为handles_sortable_columns的宝石,它可以让你完全没有任何努力的可排序列。

亚历

答案 1 :(得分:0)

发现了这个问题。我的播放器模型中有以下代码:

Player.rb

default_scope :order => 'name_e'

因此,生成的SQL搜索如下所示:

SELECT `players`.* FROM `players` ORDER BY name_e, avg_points desc