form_for将输入值保存到会话变量

时间:2013-07-24 16:57:01

标签: ruby-on-rails

我正在尝试为学校的索引创建比较功能。目前我正在使用以下代码,它接受任何检查学校并将其添加到params中的school_ids []。

在我的gemfile中:

  gem 'will_paginate'

在我学校的index.html.erb:

  <%= form_tag compare_path, :method => 'get' do %>
    <%= submit_tag "Compare" %> 
    <ul>
      <% @schools.each do |school| %>
        <li>
        <%= check_box_tag'school_ids[]', school.id %>
        <%= link_to school.name, school %><br>
        <%= school.city %>, <%= school.state %>
        </li>
      <% end %>
    </ul>
  <% end %>

在我的学校控制器中,我有:

  def compare
    @schools = School.find(params[:school_ids])
  end

只要所有支票学校都在同一页面上,这项工作就很有效。但由于我使用will_paginate对学校列表进行分页,如果我更改页面,则复选框不会保留。我假设我需要以某种方式保存到会话。

1 个答案:

答案 0 :(得分:0)

您的意思是您希望能够在索引的第1页上为学校A添加复选标记,转到索引的第2页并为学校B添加另一个复选标记,然后提交比较表格并查看学校A和B?如果是这种情况,那么你是正确的,你需要将复选框放入会话中。附加js点击事件,例如

$('.checkbox_class').click(function(){
    $.post('update_session_method', { school_id: $(this).val(), checked: $(this).is(:checked)]);
});

然后添加控制器方法

def update_session_method
  session[:school_ids] ||= []
  if params[:checked]
    session[:school_ids] << params[:school_id]
  else
    session[:school_ids].delete(params[:school_id])
  end
end

然后你的比较方法

def compare
  @schools = School.find(params[:school_ids].merge(session[:school_ids] || []))
end