所以这是一个简单的项目,其中有产品,您可以对其进行投标。想想易趣。
我构建的项目如下:
$ rails new routetest
$ rails g scaffold product productname reserveprice:integer
$ rails g scaffold bid bidprice:integer product_id
在我包含的每个产品的“显示”视图上
- 产品详细信息(由脚手架生成)
- 迄今为止的投标清单
- 使用 form_for 助手提交新投标的表单
<p id="notice"><%= notice %></p>
<h2>Normal Products\Show Part</h2>
<p>
<strong>Productname:</strong>
<%= @product.productname %>
</p>
<p>
<strong>Reserveprice:</strong>
<%= @product.reserveprice %>
</p>
<%= link_to 'Back', products_path %>
<br /><br />
<h2>List of bids</h2>
<table>
<thead>
<tr>
<th>Product ID</th>
<th>Bid Price</th>
</tr>
</thead>
<tbody>
<% @bids.each do |bid| %>
<tr>
<td><%= bid.product_id %></td>
<td><%= bid.bidprice %></td>
</tr>
<% end %>
</tbody>
</table>
<br /><br />
<h2>Form For Bids</h2>
<h4>Make a Bid</h4>
<%= form_for(@bid) do |b| %>
<div class="field">
<%= b.number_field :bidprice %>
</div>
<div>
<%= b.hidden_field :product_id, :value => (params[:id]) %>
</div>
<div class="actions">
<%= b.submit %>
</div>
<% end %>
单击“提交”后,将调用出价控制器#create 操作。
def create
@bid = Bid.new(bid_params)
if @bid.save
redirect_to "/products/#{@bid.product_id}", notice: 'Bid was successfully created.'
else
render action: 'new'
end
end
因此,成功的出价将使用户返回到产品展示视图,并将记录添加到页面的出价部分。
我在出价模型中有一个 validates_presence_of 验证。因此,如果用户将出价字段留空,则验证失败,并且出价控制器 crate 操作将呈现出价新视图。包括错误消息。出价新视图包括脚手架生成的代码“ 等”
我实际上想做的不是呈现新操作,而是将用户返回到产品显示页面,就像成功出价时所做的那样,仅在产品显示页面上显示错误消息。基本上,这给用户一种留在产品展示页面上的感觉,而不是把他们扔到出价新页面上。
我遇到的问题是如何将错误消息传递回产品展示页面?如果我编辑出价控制器,请在上面创建操作代码,并将“渲染操作:‘新’”行替换为
redirect_to "/products/#{@bid.product_id}"
然后用户返回到页面,但错误消息未传递。我认为这是因为错误消息被存储为新操作(出价控制器)渲染的一部分
所以我的问题是我如何实现我想做的事情?返回产品显示视图并显示来自验证失败的错误消息。谢谢。
PS - 我知道我需要将脚手架生成的代码“ ...”代码添加到产品显示视图中,但我没有在上面的代码中这样做,因为它会导致NilMethod 错误,因为该错误不是为该方法存在而创建的。