验证失败并且表单重定向回自身后,为什么实例变量为空?

时间:2012-06-10 17:43:51

标签: ruby-on-rails

在Rails 3.2应用程序中,当某个表单无法保存(验证失败)并重定向回表单时,我收到错误:

undefined method `map' for nil:NilClass

直接导航到新路径或编辑路径时,此表单不会显示任何错误。

错误来自具有自定义options_from_collection_for_select方法的选择字段。

<%= f.select(:user_ids, options_from_collection_for_select_with_attributes(@users, :id, :name, 'data-attributes', :attributes ), {include_blank:true}, {multiple:true}) %>

如果我将实例变量@users替换为User.all,那么重定向后我不会收到错误。

我认为重定向后@users为空,因此错误。但为什么? @users在新的和编辑控制器中定义。

我的控制器是:

def create
  --bunch of stuff
  if @model.save
    --bunch of stuff
    respond_to do |format|
      format.html { render :text => model_url(@model) }
      format.html { redirect_to(@model, :notice => 'Success!.') }
      format.xml  { render :xml => @model, :status => :created, :location => @model }
    end

  else
    respond_to do |format|
      format.html { render :action => "new" }
      format.xml  { render :xml => @model.errors, :status => :unprocessable_entity }
    end
  end
end

1 个答案:

答案 0 :(得分:13)

这是因为如果失败,你实际上并没有执行“新”动作。这是典型的控制器结构

class PotsController < ApplicationController

  def new
    @pot = Pot.new
    @users = User.all
  end

  def create
    @pot = Pot.new(params[:pot])
    if @pot.create
      redirect_to @pot, notice: "Created"
    else
      #****you are here****
      render :new
    end
  end
end

在上面,如果pot.create失败,它只会呈现新模板。你应该做的是在这种情况下得到你的实例变量

  def create
    @pot = Pot.new(params[:pot])
    if @pot.create
      redirect_to @pot, notice: "Created"
    else
      @users = User.all #this is the important line
      render :new
    end
  end