渲染:编辑导致表单URL更新后更改/失败

时间:2014-11-26 03:21:33

标签: mysql ruby-on-rails forms url routing

我目前有一个工作表单,在#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

1 个答案:

答案 0 :(得分:1)

渲染前需要build_nanny_associations。这就是重定向工作的原因。渲染器不会调用控制器,因此为什么会出现未知列。

很高兴帮助