2012-08-15 74 views
0

我正在构建一个应用程序,供用户发布。每篇文章都有一个upvoted和downvoted。在显示帖子的位置,我有一个允许用户过滤帖子的小表格。它只是传递一个参数给名为params [:post_filter](localhost:3000/somepage?post_filter = value)的url。现在,这工作得很好,除了我写的修改查询的私有方法无效。控制器私有方法不起作用

这里是我的查询:

def room 
      @posts = Post.where('lesson_id = ?', params[:id]).order(post_filter_params).page(params[:page]).per(30) 
    end 

,这里是我的私有方法:

private 

def post_filter_params 
    chosen_option = params[:post_filter].to_i == 1 or 2 or 3 ? params[:post_filter] : '1' 
    case chosen_option 
    when 1 
     'created_at DESC' 
    when 2 
     'upvotes DESC' 
    when 3 
     'downvotes DESC' 
    end 
end 

现在,每当我代替我的私有方法与字符串之一的.order()值,一切都按计划进行。但是,在.order()值中放置私有方法名称不起作用。对发生了什么的任何想法?

编辑

,以确保所有值都相同的数据类型我这样做,但它仍然不能正常工作:

def post_filter_params 
    param_option = params[:post_filter].to_i 
    chosen_option = param_option == 1 or 2 or 3 ? param_option : 1 
    case chosen_option 
    when 1 
     'created_at DESC' 
    when 2 
     '(upvotes - downvotes) DESC' 
    when 3 
     'downvotes DESC' 
    end 
end 

回答

2

我不认为私有方法做什么,你认为它。

这个怎么样?

def post_filter_params 
    case params[:post_filter].to_i 
    when 1 
    'created_at DESC' 
    when 2 
    'upvotes DESC' 
    when 3 
    'downvotes DESC' 
    else 
    'created_at DESC' 
    end 
end 
+0

那么,你的代码工作,但私人不是问题。我很感谢你,先生。 http://i.imgur.com/cHapI.jpg – flyingarmadillo 2012-08-15 12:00:29

+1

对不起,这不是我的意思。我指的是'selected_option = param_option == 1或2或3? param_option:1'行。 – 2012-08-15 12:01:45

1

尝试与弦数或弦比较数字。

报价1,2,3

when '1' 
... 

或转换chosen_options数点

+0

我做了改变,但没有运气。我发布了它的更新。 – flyingarmadillo 2012-08-15 11:53:59

0

我想说明一下@shioyama的要点。首先,让我们专注于这个代码:

param_option = params[:post_filter].to_i 
chosen_option = param_option == 1 or 2 or 3 ? param_option : 1 

在IRB会议..

irb(main):005:0> param_option = 1 
=> 1 
irb(main):006:0> chosen_option = param_option == 1 or 2 or 3 ? param_option : 1 
=> true 
irb(main):007:0> chosen_option 
=> true 
irb(main):008:0> param_option = 2 
=> 2 
irb(main):009:0> chosen_option = param_option == 1 or 2 or 3 ? param_option : 1 
=> 2 
irb(main):010:0> chosen_option 
=> false 

因此,该行chosen_option = param_option == 1 or 2 or 3 ? param_option : 1相同chosen_option = (param_option == 1) or (2) or (3 ? param_option : 1),那将是要么truefalse

你想要的是,可能是:chosen_option = param_option == 1 || param_option == 2 || param_option == 3 ? param_option : 1

irb(main):036:0> chosen_option = param_option == 1 || param_option == 2 || param_option == 3 ? param_option : 1 
=> 3 
irb(main):037:0> chosen_option 
=> 3 

一个常见的捷径是chosen_option = [1, 2, 3].include?(param_option) ? param_option : 1。但是,在这种情况下,最好是什么@shioyama建议:

def post_filter_params 
    case params[:post_filter].to_i 
    when 2 
    'upvotes DESC' 
    when 3 
    'downvotes DESC' 
    # you can just fallback to else 
    # when 1 
    # 'created_at DESC' 
    else 
    'created_at DESC' 
    end 
end 

和最后提示:考虑使用CONSTANTS,而不是神奇数字,它会帮助其他人阅读你的代码和自己在一个(非长)未来:)