在rails中保留错误消息

时间:2011-08-04 21:39:32

标签: ruby-on-rails redirect persistence

我有以下内容:

def create
  @product = Product.find(params[:product_id])
  @review = @product.reviews.build(params[:review])

if @review.save
  flash[:notice] = "Successfully created review."
    redirect_to product_url(@review.product_id)
else
  render new_product_review_path(@review.product_id)

end

我的表格如下:

<% if @review.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@review.errors.count, "error") %> prohibited this product from being save</h2>
  <ul>
  <% review.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
  </ul>
</div>
<% end %>

<% form_for [@product, @review] do |f| %>
<p>
  <%= f.label :email, 'Email' %><br />
  <%= f.text_field :email %>
</p>
<p>
  <%= f.label :rating, 'Rating' %><br />
  <%= f.text_field :rating %>
</p>
<p>
  <%= f.label :comment, 'Comment' %><br />
  <%= f.text_area :comment, :rows => '12', :cols => 35 %>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>

在观看/评论中,我有一个new.html.erb文件,用于呈现表单。

当我在该表单上验证失败时,我得到了

缺少模板

缺少模板/产品/ 1 /评论/新版{:handlers =&gt; [:erb,:rjs,:builder,:rhtml,:rxml],:formats =&gt; [:html],:locale = &gt; [:en,:en]}在视图路径“/ Users / myname / Sites / reviews / app / views”中,

如何保留错误以便在表单中呈现?

2 个答案:

答案 0 :(得分:0)

而不是:

render new_product_review_path(@review.product_id)

你可以使用:

render :template => "reviews/new"

有关渲染的更多信息,我建议阅读: http://edgeguides.rubyonrails.org/layouts_and_rendering.html

修改

使用

render new_product_review_path(@review.product_id)

您想在此处呈现位于文件系统中的模板:

yourapp/views/products/1/reviews/new.html.erb

(请参阅给您的遗失模板错误)

我想,正确的道路是:

yourapp/views/reviews/new.html.erb

答案 1 :(得分:0)

将您的创建操作更改为此

def create
  @product = Product.find(params[:product_id])
  @review = @product.reviews.build(params[:review])

  if @review.save
    flash[:notice] = "Successfully created review."
    redirect_to product_url(@review.product_id)
  else
    render :action => 'new'
  end
end

render:action命令有点误导,因为它在当前操作中渲染new.html.erb模板而不是调用新操作。

这样做完全正确,因此视图的@product和@review对象处于由表单设置的状态加上在保存失败之前所做的任何更改。如果您实际上正在尝试重定向到某个操作,那么在用户点击创建按钮之前所做的任何表单更改都将丢失。如果你这样做,flash消息仍会显示,因为flash实际上是会话散列的别名。