我有以下内容:
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”中,
如何保留错误以便在表单中呈现?
答案 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实际上是会话散列的别名。