2012-06-07 101 views
2

我有一个电影列表以及他们的评级。在我的页面顶部,我有一个表格,列出了显示每个可用评分(G,PG-13等)的复选框。一旦用户点击复选框并点击提交,我只想让选定的电影出现。使用复选框过滤列表

在我的索引方法中,我有一个名为@filtered_ratings的实例变量,它从检查的电影中收集键。我的想法是使用find方法在我的控制器中更改@movies,并将@filtered_ratings中的键匹配到电影列表中。不过,我认为我一直在做这个不正确的工作,因为我无法实现它。我尝试了几种方法,如@movies=Movie.find(params[:id] = @filtered_ratings),但我知道这是不正确的。有什么建议么?

回答

6

假设您的复选框的形式是一样的东西:

<%= form_tag method: (blah), url: (blah) do %> 
    <%= check_box_tag 'ratings[]', "R" %> 
    <%= check_box_tag 'ratings[]', "PG" %> 
    <%= check_box_tag 'ratings[]', "PG-13" %> 
    <%= submit_tag 'Submit' %> 
<% end %> 

,你会得到PARAMS [:等级] = [ “R”, “PG” 如果说前两个箱子检查。所以,在控制器中你可以做

Movie.where("rating IN (?)", params[:ratings]) 

。这假设你的电影有一个'评级'属性。

+0

你的假设是对的;不过,我只是使用一个块来生成一切。另外,当我将控制器更改为建议的代码时,它会完全删除电影列表。最后,我们被明确告知'find'会是最简单的方法。 – Anconia

+0

如果你绝对必须使用'find',你可以改为使用Movie.find(:all,conditions:[“rating IN(?)”,params [:ratings]]),但这会产生相同的SQL查询。如果此代码删除电影列表,params [:ratings]可能为零或为空。你在params散列中看到了什么值? – cdesrosiers

+0

在我的索引页面的顶部,我放了'= params [:ratings] .keys',并且渲染的值是被选框的值。所以我确定params散列不是空的。 – Anconia