2011-09-12 95 views
1

我已经在同一视图中构建了来自不同模型的多个表单的仪表板。我的目标是让每个表单的所有错误消息在仪表板上呈现。仪表板是PagesController的一部分,表单属于其他控制器。Rails在一个视图中呈现多个表单呈现错误问题

目前所有的表格都很好用。但是,如果发生错误,则会在其他视图中呈现而不是仪表板。当我试图“呈现”仪表板页面上的错误时,我收到其他表单模型丢失的错误。

在仪表板视图外呈现的“渲染”的示例。

class NotesController < ApplicationController 
    def create 
     @note = Note.new(params[:note]) 
     if @note.save 
      flash[:notice] = "Note Created!" 
      redirect_to dashboard_path 
     else 
      flash[:alert] = "Note failed" 
      render :action => "new" 
     end 
    end 
end 

我想工作的例子,它呈现仪表板视图内的错误。

class NotesController < ApplicationController 
    def create 
     @note = Note.new(params[:note]) 
     if @note.save 
      flash[:notice] = "Note Created!" 
      redirect_to dashboard_path 
     else 
      flash[:alert] = "Note failed" 
      render 'pages/home' 
     end 
    end 
end 

要重申,我试图让它这样所有的错误都将显示在仪表板页面上破了该网站。如果您想了解更多信息,请告诉我。

回答

0

您可以只设置错误实例变量,所有形式的使用做到了这一点:

class NotesController < ApplicationController 
    def create 
     @note = Note.new(params[:note]) 
     if @note.save 
      flash[:notice] = "Note Created!" 
      redirect_to dashboard_path 
     else 
      @errors = @note.errors 
      load_home 
      render 'pages/home' 
     end 
    end 

    private 

    def load_home 
     @instances = Model.all 
     @instance_1 = Model.find(1) 
    end 
end 

所有的控制器将设置@errors = @ model.errors那么在你看来,你只需要像这不是依靠f.error_messages或者你在你的形式有: (以HAML)

- unless @errors.nil? 
    #errorExplanation 
    %h2 Please correct these errors 
    %ul 
     - for e in @errors 
     %li= e[1] 
+0

我可能会错误地理解这一点,但是当我使用渲染“页/家”我的观点无法加载。我怀疑这是做'页/家'没有加载所有必要的实例变量。因为渲染是渲染页面/主页视图,但不是具有实例变量的页面/主页操作。 – jlarry

+0

它看起来像我需要像这个宝石,https://github.com/rails/render_component,我只是想弄清楚是否有一个正确的方法来做到这一点在轨道。 – jlarry

+0

您可以创建一个load_home私有方法,为您加载实例变量。 (编辑答案) –