在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
答案 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