【问题标题】:Rails: how to get fields of rejected submit form?Rails:如何获取拒绝提交表单的字段?
【发布时间】:2013-10-29 16:56:37
【问题描述】:

我得到了一个包含许多字段的大表格。有多个select_tag 字段:

  -(0..2).to_a.each do |id|
    = select_tag('product[category_ids][]', options_from_collection_for_select(Category.all, :id, :name), :prompt=> '-- Select a Category --')

问题:如果表单在提交时被拒绝,:new 操作不会记住之前选择的 select_tags 值是什么。

提交后所有其他字段都会重新出现(如:title:description),但categories_id 会丢失。

可能的解决方案:我们必须在options_from_collection_for_select 方法中为select_tag 添加默认选择。如何获得category_id 值?我们如何访问之前表单的字段?

options_from_collection_for_select(Category.ordered, :id, :name, category_id)

【问题讨论】:

  • 你试过你的“可能的解决方案”吗?它奏效了吗?如果是这样,这应该以问答形式发布。
  • 这并不完全是一个解决方案,因为有一个未知变量 - 'category_id'。我的问题是:“我怎样才能得到那个未知变量?”。
  • 我会使用 ajax 并使用 json 或 FormData 提交表单。如果失败,请使用响应突出显示无效输入(您永远不会离开页面,因此保留用户输入)。如果成功,则在位置标头中返回一个 url,并使用pushStatewindow.location 进行重定向。表单仍然应该为没有 js 的用户提交 - 他们只是在失败时不会看到他们的原始值。

标签: ruby-on-rails forms haml


【解决方案1】:

您可以将此数据存储在会话中,并在新操作中加载它(如果存在)并从会话中清除。

这样,任何时候字段拒绝未记住的字段都会加载到会话中并加载到新操作的选择中。否则当这个会话变量为空时什么都不加载。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    以我的形式

    @product.categories = []
    

    但是

    @product.category_ids = [1,42,57]
    

    所以我添加了一个凌乱的if声明:

    -if @product.category_ids.count == 0  #create new product
      -(0..2).to_a.each do |id|
        = select_tag('product[category_ids][]', options_from_collection_for_select(Category.all, :id, :name), :prompt=> '-- Select a Category --')
    -else  #edit old product, or fixing errors to previous submit
      -@product.category_ids.each do |category_id|
        = select_tag('product[category_ids][]', options_from_collection_for_select(Category.all, :id, :name, category_id), :prompt=> '-- Select a Category --')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多