gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:03:04 25 4
gpt4 key购买 nike

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

在我的问题 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com