我有一个用于创建的表单动作潜在生成错误(即第一名称缺失),然后重新导向。

的问题是,当发生重定向那些形式错误迷路。 我怎么能在一个会议上通过这些形式错误显示在原来的形式(这仍然应该在原来的error_messages行为与以前的信息填写,如)回来了?

谢谢!


代码:

def create
  @contact = Contact.new(params[:contact])
  if @contact.save
    flash[:notice] = "Sent."
  else
    flash[:notice] = "Error."
  end
end
有帮助吗?

解决方案

这是一个棘手的问题,我已经有麻烦喽。我要问的第一个问题就是为什么你需要当发现错误时重定向?强迫你当有错误被Rails框架的,由于复杂性和可用性问题的设计师有意识地决定的动作来呈现。

这里的大问题,所以在你的行动,你创建一个使用PARAMS一个模型的实例,对象验证失败,您决定重定向到另一个动作。重定向到另一个动作之前,你必须保存模型实例的会话的当前状态,然后重定向到行动:FOO。在行动:FOO你不得不重新尝试更新的属性,并通过实例变量传递错误的观点。这里的问题是,你在连接你的控制器,它是一件坏事动作(一个动作是依赖于其他)。还有的,我可以键入的是永远的其他一大堆问题,但如果你只需要为一个资源做到这一点,这里就是我会做到这一点:

配置/ routes.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

应用程序/视图/东西/ new.html.erb

<% if defined?(@errors) %>
<% #do something with @errors to display the errors %>
<% end %>

<!-- render the form stuff -->

我知道你在想什么......这是可怕的。相信我,我做了很多尝试来解决这个问题的,我已经认识到,轨道开发商选择的机制是处理错误的最好和最简单的方法。

其他提示

在导轨的约定是呈现原始动作的视图,而不是进行重定向。所以,你的代码应该是这样的:

def create
  @contact = Contact.new(params[:contact])
  if @contact.save
    flash[:notice] = 'Sent.'
    redirect_to @contact
  else
    flash.now[:notice] = 'Error.'
    render :new
  end
end

如果有需要的new动作做任何额外的设置,提取共同代码到一个私有方法并调用它在两个before_filternew一个create

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top