在 Rails 中的 form_with 中重新加载页面时保留复选框值 5

Retain checkbox value on page reload in form_with in Rails 5

我有一个使用 form_with 创建的表单。我需要的是在页面重新加载后保留使用该表单提交的值。我可以保存 text_field 的值,但不能保存 check_box 的值。我应该在我的代码中更改什么才能实现相同的目标?

html.erb

<%= form_with url: search_path,
                      id: :search_by_filter,
                      method: :get, local: true do |f| %>   

  <div>
    <p><strong>Search by Name</strong></p>
    <%= f.label 'Name' %>
    <%= f.text_field :name, value: params[:name] %>
  </div>
  <br>

  <div>
    <%= label_tag  do %>
      <%= f.check_box :only_students, checked: params[:only_students] %>
      Show only students
    <% end %>
  </div>
  <br/>


  <div class="submit_button">
    <%= f.submit :Search %>
  </div>

<% end %>

controller.rb

def get_desired_people(params)
  people = Person.includes(:country, :state, :university).order(id: :desc)  
  people = people.where(is_student: params[:only_students]) if params[:only_students]
  people = people.where(name: params[:name]) if params[:name].present?
  people
end

在这里我可以保留 params[:name] 的值但不能保留 params[:only_students] 的值。表单提交后它始终保持未选中状态。如何保留选中和未选中的值?

f.check_box check_box_tag 期望通过布尔值检查,并且每个参数都是一个字符串(如果存在,字符串总是被评估为真)所以你应该做: checked: params[:only_students].present? 您不必担心参数的值,因为在发布时不会发送未经检查的参数。

编辑:

以上适用于 check_box_tagf.check_box 是有技巧的,你应该仔细阅读描述: https://api.rubyonrails.org/classes/ActionView/Helpers/FormBuilder.html#method-i-check_box 您描述的行为似乎非常正确,您可以处理它或在不更新模型属性时切换到 check_box_tag 作为更好的选择

以上所有解决方案都不适合我。试试这个:

<%= check_box_tag :only_students, true, params[:only_students] %>