表单刷新

时间:2016-05-04 18:57:12

标签: ruby-on-rails forms ruby-on-rails-4 checkbox checked

我在表单中使用了Rails 4 collection_check_boxes 。填写表格,我检查一些复选框。我注意到,当表单在验证错误后刷新时,检查的复选框仍然存在。这是标签的一个特征吗?我无法在文档中找到这些信息。

复选框表单字段代码:

<div class="field">
  <%= f.label "Area of Interest" %><br />
  <%= f.collection_check_boxes :interest_ids, Interest.all, :id, :name do |b| %>
    <div class="collection-check-box">
      <%= b.check_box %>
      <%= b.label %>
    </div>
  <% end %>
</div>

我确实希望复选框在表单刷新后保持检查,但是想确保它是一个功能,而不仅仅是巧合,它对我有用。

任何信息都会有所帮助,谢谢!

2 个答案:

答案 0 :(得分:0)

我不认为验证失败页面刷新与“表单刷新”的操作相同,除非您在控制器中添加了如果表单无法保存则会重置表单的语言。

当您检查表格中的interest_ids并点击“提交”时,它会将任何已验证的值作为已保存的:interest_id值添加到您的模型中,这样即使整个表单验证失败,保存的值也会使复选框保持不变。

如果要在表单的任何部分未通过验证时重置表单,我建议在创建操作中向控制器添加if / else语句。 @ object.interest_ids = []会将对象上存储的interest_ids重置为空数组,取消选中这些框。

def create
  @object = Object.new
  if @object.save
    redirect_to object_path(@object)
  else
    @object.interest_ids = []
    render :new
  end
end

答案 1 :(得分:0)

只要您在失败的保存/验证时使用render :action代替redirect_to :action呈现您的表单,它就是代码的一项功能:

def create
  @user = User.create(user_params)
  if @user.valid?
    redirect_to action: :show
  else
    render :new # @user gets passed to form_for
  end
end

关键区别在于,当您使用render :new时,您的创建操作中的@user模型实例会传递到您的表单。

现在,在new.html.erb视图中:

form_for @user do |f|
  # Fields using the syntax f.text_field :attr_name, `f.collection_check_boxes :attr_name`, etc will reference the :attr_name in both @user to populate the value(s). Also, @user.errors[:attr_name] to show an error message, if present.
end

基本上,您的控制器中发生的事情是您在模型上调用savecreatevalidatevalid?之一。调用其中一个方法后失败的验证会阻止保存到数据库,但失败的值仍然存在于@user对象中。此外,errors对象现在填充了有关哪些属性无法更新的信息以及验证失败的原因。

因此,当您重新呈现表单时,您会看到仍然选中了复选框,因为它们是从模型实例本身的值中填充的。同样,任何具有匹配错误的字段也应该显示该字段的错误。