2013-05-09 111 views
0

我在Rails中显示错误时遇到了问题。 这里是我的控制器在Ruby on Rails中显示错误

def new 
    if current_user 
     @edible = Edible.new 
    else 
     flash[:notice] = "You need to be signed in for this action" 
     redirect_to root_path 
    end 
end 

def create 
    @edible = Edible.new(params[:edible]) 
    if @edible.valid? && current_user.edibles.push(@edible) 
     if(params[:edible][:pickup] == "1") 
      respond_to do |format| 
       format.html { redirect_to new_user_edible_pick_up_adress(current_user.id, @edible.id) } 
      end 
     else 
      respond_to do |format| 
       format.html { redirect_to(user_edible_path(current_user.id, @edible.id), 
           :success => "Product saved") 
          } 
      end 
     end 

    else 
     respond_to do |format| 
      format.html { redirect_to(new_user_edible_path(current_user.id, 
       :alert => "Error happend")) 
      } 
     end 

    end 

end 

形式:

<%= nested_form_for @edible, :url => user_edibles_path, 
    :html => { :multipart => true, :class => "signin" } do |f| %> 
    <%= render 'shared/alerts', :object => @edible %> 
#standart code further... 

和部分:

<% if flash[:notice] %> 
     <p class="notice"><%= flash[:notice] %></p> 
    <% end %> 
<% if flash[:error] %> 
    <p class="error"> 
     <% if object %> 
      <%= flash[:error] %> 
      <ul> 
      <% object.errors.full_messages.each do |msg| %> 
       <li> <%= msg %> </li> 
      <% end %> 
      </ul> 
     <% end %> 
    </p> 
<% end %> 
<% if flash[:alert] %> 
    <p class="alert"><%= flash[:alert] %></p> 
<% end %> 

我认为重定向到新的页面时@edible变量没有通过,所以路轨上行驶的对象每次都在新实例上创建错误。 我错过了一些明显的事情?

+0

这个'partial'你有这个在'shared/alerts'目录里面吗? – David 2013-05-09 11:47:49

+0

生成的HTML不包含'p.notice'?你确定你正在渲染正确的部分?你不应该需要将闪光灯传递给你的部分。 – fotanus 2013-05-09 11:55:05

+0

部分位于正确的目录并且正在显示Flash消息,问题是<%= object.errors.full_messages.each ...%>不显示。 – DarkSun 2013-05-09 12:21:55

回答

1

我假设@edible变量在重定向到新页面时不通过

正确。这是预料之中的,因为HTTP是一种无状态协议。

在窗体上显示错误的诀窍是在出现错误的对象时渲染它。这意味着如果你的模型在创建操作中失败了验证,你应该渲染而不是重定向。

def create 
    @edible = Edible.new(params[:edible]) 
    if @edible.valid? && current_user.edibles.push(@edible) 
     # No changes here 
    else 
     respond_to do |format| 
      format.html { render :new } # Instead of redirecting just render the form 
     end 

    end 

end 
0

我认为如果在写入flash [:notice]之后有重定向,那么闪存将被清除/它将显示适用于根路径的闪光通知,而不是可用/新路径。

作为测试,也许尝试:

def new 
    if current_user 
     @edible = Edible.new 
    else 
     flash[:notice] = "You need to be signed in for this action" 
    end 
end 

这将留给用户的“新”行动,只是添加:

<%= flash[:notice] %> 

到“新”行动,看看当他们没有登录时显示错误。

+0

感谢您的回复,但实际上Flash中的邮件显示正确,我无法使用<%object.errors.full_messages ...%>显示错误 – DarkSun 2013-05-09 12:20:16