我在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变量,因此Rails每次都会在新实例上运行object.errors。 我错过了一些明显的事情吗?
答案 0 :(得分: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
答案 1 :(得分: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] %>
到“新”操作,以查看错误是否在未登录时显示。