好的,所以基本上,我的模型有一个正常的形式:
= form_for @operator do |f|
blah blah blah
在我的操作员控制器中,我有这个:
def new
@operator = Operator.new
@operator.build_user
respond_to do |format|
format.html {}
end
end
def create
@user = User.create(params[:operator].delete(:user))
@user.update_attributes(:login => @user.email)
@operator = Operator.new(params[:operator].merge(:user => @user))
respond_to do |format|
if @operator.save
format.html {redirect_to new_operator_aircraft_path(@operator)}
else
format.html { render :action => "new", :error => @operator.errors }
end
end
end
非常基本的东西。我的模型中有一些validates_presence_of
的东西,所以当我提交表格时,它应该自然地显示我有错误(并保留我填写的字段)
到目前为止?是的。问题是,似乎我正在发布到/运算符,这就是渲染。我似乎忘记了 Rails2.3+ 中发生的事情,但我不应该再次被重定向到/operator/new 吗?还是一直都是预期的行为?
以下是我认为您要问的问题:
提交有错误的表单后,为什么 URL 阅读"/运算符"而不是 "/运算符/新"。
由于资源丰富的路由,当通过 POST 向"/operator"提交表单时,将在操作员控制器上调用创建操作。如果在保存运算符时遇到错误,则已指示控制器在同一请求中呈现新操作。
render :action => "new", :error => @operator.errors
这意味着不会发生重定向,因此 URL 仍为"/运算符"。
如果发生重定向,您将丢失当前请求中@operator对象的所有状态信息,包括您遇到的错误以及您刚刚提交的表单值。
换句话说,按预期工作。