在我的问题控制器新 *** 作中,我为我的用户创建了五个选项
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呈现带有嵌套属性数组的表单所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)