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

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

概述我有问题模型,有很多选择. 在我的问题控制器新 *** 作中,我为我的用户创建了五个选项 def new @question = Question.new 5.times.with_index do |index| @question.options.build(:order => index) end respond_to do |format| format.htm 我有问题模型,有很多选择.

在我的问题控制器新 *** 作中,我为我的用户创建了五个选项

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 }  endend

在视图中,我遍历所有选项

- 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  endend

我的问题控制器创造了行动

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"  endend

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

如果我用“false”替换我的创建 *** 作中的“@ question.save”,则行为是相同的.所以这表明我在create action中创建@question变量的方式有责任抛弃我的空选项.

但是,如果我从我的问题模型中删除:reject_if,则在失败的问题保存之后会出现空选项. (我在选项模型中对选项属性进行了状态验证)所以这告诉我在创建 *** 作中创建@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呈现带有嵌套属性数组的表单全部内容,希望文章能够帮你解决ruby-on-rails-3 – 在验证失败后,Rails 3呈现带有嵌套属性数组的表单所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1273734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存