我目前有一个工作表单,在#update中调用render :edit
之后中断。在#update 中render :edit
之后,#edit页面的网址会从questionnaires/1/edit
更改为<{1}} 。
与大多数表单不同,我的#edit和#show页面是不同的页面,代表这个由两部分组成的不同步骤。在questionnaires/1
之后,任何新的保存或提交尝试都会失败,大概是因为#edit( PUT render :edit
)现在与#show 共享相同的路径(GET {{1 }})
使用redirect_to正确保存表单但在这种情况下我需要使用render来检索错误消息。
questionnaires/1/edit
的持久性?其他详细信息(如果需要):
表单允许用户保存或提交更改。提交questionnaires/1/edit
后,在Questionnaire.rb中运行,将错误消息添加到问卷表单中(如果存在)。 (由于表格需要保存,即使存在缺少的字段,我也避免使用带有保存的验证来生成错误)
render
在我的控制器中,表单的第一步是在#edit中。在#update到#edit之后,我使用 check_if_finished
重新显示#edit页面。使用redirect_to可以正确保存表单,但我不能使用class Questionnaire < ActiveRecord::Base
include HashKey
belongs_to :nanny, foreign_key: :nanny_recruit_id
accepts_nested_attributes_for :nanny
has_one :driving_ability
. . .
def check_if_finished
errors.add(:first_name, (custom_error_opening + 'requires answer')) if nanny.first_name.empty?
errors.add(:last_name, "requires answer") if nanny.last_name.empty?
errors.add(:preferences, "must select at least one preference") if self.preferences.empty?
end
. . .
end
,因为它会在没有持久性的情况下重新加载#edit页面,这意味着我的错误消息不会显示,除非我将错误重构为Flash消息之类的内容
render :edit
有关详细信息,请参阅表格的一部分:
redirect_to
我的Rails版本是3.0.9。这是我使用render时生成的错误的堆栈跟踪:edit:
class QuestionnairesController < ApplicationController
layout 'public'
before_filter :find_questionnaire, only: [:edit, :update, :show, :destroy]
# before_filter :set_commit_param
# GET /questionnaires/1
def show
build_nanny_associations
end
# GET /questionnaires/new
def new
@questionnaire = Questionnaire.new
build_nanny_associations
end
# GET /questionnaires/1/edit
def edit
build_nanny_associations
end
# POST /questionnaires
def create
@questionnaire = Questionnaire.new(params[:questionnaire])
if @questionnaire.save
redirect_to(@questionnaire, :notice => 'Questionnaire was successfully created.')
else
render :action => "new"
end
end
# PUT /questionnaires/1
def update
update_questionnaire
render :edit and return unless @questionnaire.valid?
if params[:commit].match('Next >>')
@questionnaire.check_if_finished
render :edit and return unless @questionnaire.errors.empty?
flash[:success] = ['Questionnaire Step 1 finished!']
redirect_to questionnaire_path(@questionnaire)
else
(flash[:notice] = ['Application Saved!']) + (flash[:info] = questionnaire_url_explanation)
redirect_to edit_questionnaire_path(@questionnaire)
end
end
# DELETE /questionnaires/1
def destroy
@questionnaire.destroy
redirect_to(questionnaires_url)
end
private
def update_questionnaire
@questionnaire.update_attributes(params[:questionnaire])
end
def build_nanny_associations
@questionnaire.educations.build if @questionnaire.educations.empty?
@questionnaire.build_driving_ability
@questionnaire.driving_ability.driving_ability_cars.build
if @questionnaire.nanny_times.empty?
(0..6).to_a.each do |n|
@questionnaire.nanny_times.build(day: n)
end
end
end
# def set_commit_param
# params[:commit] ||= ""
# end
def questionnaire_url_explanation
["If you need more time to fill out your application, you can revisit this page by checking the link sent to your email, or by visiting: #{url_for(@questionnaire)} "]
end
def find_questionnaire
NannyRecruit.new # this is here to have rails autoload this class
@questionnaire = Questionnaire.find_by_hash_key(params[:id])
end
end
答案 0 :(得分:1)
渲染前需要build_nanny_associations。这就是重定向工作的原因。渲染器不会调用控制器,因此为什么会出现未知列。
很高兴帮助