这是一个棘手的问题,我自己也遇到了麻烦。我要问的第一个问题是,为什么在发现错误时需要重定向?由于复杂性和可用性问题,Rails 框架的设计者有意识地决定在出现错误时强制您呈现操作。
这是一个大问题,因此在您的操作中,您使用参数创建模型的实例,对象验证失败并且您决定重定向到另一个操作。在重定向到另一个动作之前,您必须将模型实例的当前状态保存到会话中,然后重定向到动作:foo。在行动 :foo 中,您必须重新尝试更新属性并通过实例变量将错误传递给视图。这里的问题是您在控制器中耦合动作是一件坏事(一个动作依赖于另一个动作)。还有许多其他问题我可以永远输入,但如果您只需要为一个资源执行此操作,我会这样做:
配置/路由.rb
map.resources :things, :member => { :create_with_errors => :get }
things_controller.rb
def new
@thing = Thing.new
end
def create
@thing = Thing.create(params[:thing])
if @thing.save
redirect_to things_path
else
session[:thing] = @thing
redirect_to create_errors_thing_path(@thing)
end
end
def create_with_errors
@thing = session[:thing]
@errors = @thing.errors
render :action => :new
end
应用程序/views/things/new.html.erb
<% if defined?(@errors) %>
<% #do something with @errors to display the errors %>
<% end %>
<!-- render the form stuff -->
我知道你在想什么……这太可怕了。相信我,我已经做了很多尝试来解决这个问题,并且我已经意识到,rails 开发人员选择的机制是处理错误的最佳和最简单的方法。