2012-10-20 35 views
3

我在HAML文档上有一些复选框,当点击'刷新'按钮时它应该改变显示的结果。这工作正常,但是当页面重新加载被选中的框时,所有这些都不再被选中。在HAML中保留复选框

如何重新配置​​HAML以在页面浏览中保持复选框选中状态?

= form_tag movies_path, :method => :get do 
    Include: 
    - @all_ratings.each do |rating| 
    = rating 
    = check_box_tag "ratings[#{rating}]", '1', true 
    = submit_tag 'Refresh' 

我还指定的复选框都应该被默认选中,但是当我加载网页,他们将不检查...

+1

我认为这可能是相当复杂的实现?(默认状态)。 。您必须以某种方式在请求之间保存复选框的状态。一种方法是在每次选中复选框时使用AJAX发送请求。然后服务器可以将信息存储在会话中。 另一种方式是将复选框信息存储在本地存储中,但这只适用于现代浏览器。 – Jesper

+0

+1 @Jesper我认为这是您建议的一个很好的解决方案,不要太复杂。 skeniver checkout [jquery.ajax()](http://api.jquery.com/jQuery.ajax/)发送一个请求到一个控制器动作,点击复选框并将该复选框的id(或任何)存储到在会话中选择并将它们传递到您的视图中。 – cih

+0

您可以将复选框逻辑保留在视图之外,而且应该让事情更轻松。例如,通过将新的类属性设置为params [:rating],然后将结果散列值从1更改为true,则不需要其他解决方案中描述的复杂逻辑。 – Horus

回答

0

我想复选框并不代表某些持久状态的业务数据(否则这将不适用),但它们实际上是一种“过滤器”或类似的临时配置视图。

在这种情况下,您应该只通过AJAX请求结果,而不是复选框。所以你不必将它们存储在任何地方,因为它们不会消失。

5

这将完成你想要的:来电后

= form_tag movies_path, :method => :get do 
     Include: 
     - @all_ratings.each do |rating| 
     = rating 
     = check_box_tag "ratings[#{rating}]", rating, if params[:ratings]; params[:ratings].include?(rating) end 
    = submit_tag 'Refresh' 

params[:ratings]情况仍然存在,所以你可以用它来标记的箱子,其中由用户之前点击。

2

超新星32非常接近。

缺少的唯一东西是基于最后一行“......指定复选框应该默认选中”。

您的代码应该是这样的:

= check_box_tag “评级[#{RATING}]”,1,如果PARAMS [:等级] PARAMS [:等级] .INCLUDE(评级)其他真正的最终

就包括时代ELSE语句时,参数不存在