ruby-on-rails-3 - 验证失败后带有嵌套属性数组的Rails 3呈现表单

标签 ruby-on-rails-3 nested-forms

我有很多选项的问题模型。

在我的问题 Controller 新操作中,我为我的用户创建了五个选项

def new
  @question = Question.new

  5.times.with_index do |index|
    @question.options.build(:order => index)
  end

  respond_to do |format|
    format.html # new.html.erb
    format.xml  { render :xml => @question }
  end
end

在 View 中,我遍历所有选项
- form_for(@question) do |f|
  .field                   
    = f.label :title, t("question.title")
    = show_errors_for(@question, :title)
    = f.text_field :title
  - @question.options.each do |option|
    - f.fields_for :options, option do |o|                                         
      .field                                                                       
        = o.label :option, t("question.option_no", { :index => option.order })     
        = o.text_field :option                                                     
        = o.hidden_field :order, :value => option.order                            
  .actions                                                                         
    = f.submit t("add_question.create")

我的问题模型看起来像这样
class Question < ActiveRecord::Base
  attr_accessible :title, :options_attributes

  belongs_to :user
  has_many :options

  accepts_nested_attributes_for :options, :reject_if => proc { |attributes| attributes['option'].blank? }

  validates :title, :length => { :maximum => 100 }, :presence => true
  validate :min_no_of_options

  def min_no_of_options
    if self.options.size < 3
      errors.add_to_base "Must have at least three options"
    end
  end
end

我的问题 Controller 创建 Action
def create
  if current_user
    @question = current_user.questions.build(params[:question])
  else
    @question = Question.new(params[:question])
  end

  if @question.save
    redirect_to(@question, :success => t('question.flash_success'))
  else
    flash.now[:error] = t("question.flash_error")
    render :action => "new"
  end
end

现在,当我在表单中只输入两个选项并点击创建按钮时,验证会阻止模型被保存。哪个好。但是当创建操作再次呈现新操作时,只显示我填写的选项字段。留空的三个选项字段已消失。

如果我将创建操作中的“@question.save”替换为“false”,则行为是相同的。所以这表明我在 create 操作中创建 @question 变量的方式负责丢弃我的空选项。

但是,如果我改为从我的问题模型中删除 :reject_if ,则在按预期保存失败的问题后会显示空选项。 (我在我的选项模型中对 option 属性进行了存在验证)所以这告诉我我在创建操作中创建 @question 变量的方式没有任何问题。它并没有丢弃空的选项。那么他们被踢到哪里去了?

有一个非常相似的问题,但其中的答案不是我想做的。虽然这可能是我必须做的事情。
rails fields_for does not render after validation error on nested form

编辑

在对 rails 控制台进行了更多研究后,我注意到它确实是 @question 变量的创建,其中空选项被丢弃。发生这种情况是因为我在问题模型中定义了 reject_if。在从模型中注释掉 reject_if 之后,空选项被添加到 @question 变量中。

所以我想我需要删除 reject_if 并使用 after_save 回调来销毁数据库中的空选项。这样,在问题被保存之前,我将有空选项与问题一起出现。

最佳答案

我正在回答我自己的问题,因为我解决了这个问题。

由于“问题”模型中的 reject_if,从“问题”中删除了空白“选项”。在执行下面的代码时应用了 reject_if 语句,因此删除了空白的“选项”。

@question = current_user.questions.build(params[:question])

我用 after_save 回调替换了 reject_if ,它删除了留空的选项。

关于ruby-on-rails-3 - 验证失败后带有嵌套属性数组的Rails 3呈现表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6656934/

相关文章:

ruby - 工厂女工——理解协会

javascript - 如何编写一个简洁的 JS if else 语句来通过 Cocoon 动态添加嵌套的 Rails simple_form?

ruby-on-rails-3.2 - 无法批量分配 protected 属性 : profiles,

ruby-on-rails - 在 webrick 服务器的生产模式下运行 rails

ruby-on-rails-3 - Heroku + Rails + PostgreSQL 问题

javascript - 如何使用 Haml 和 Formtastic 动态添加和删除嵌套模型字段

c++ - 使用类模板需要模板参数列表,嵌套类

ruby-on-rails-4 - ActiveAdmin 重复嵌套表单并删除复选框不起作用

ruby - 在数据库中存储object_id数组及其坐标的方法是什么?

routing - 特定资源路由操作的别名 ("/sign_in"而不是 "/sessions/new")