首页 > 解决方案 > 在 Rails 5 中的 form_with 中保留页面重新加载时的复选框值

问题描述

我有一个使用创建的表单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 %>

控制器.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]。提交表单后,它始终保持未选中状态。如何保留已检查和未检查的值?

标签: ruby-on-railsruby-on-rails-5erb

解决方案


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

编辑:

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


推荐阅读