我有一个简单的表单,它接受一些字段并将它们添加到数据库中。表单下方是一个html表,显示当前DB中的所有产品。
控制器:pages
,操作:product
#@product is for form capture
#@prods is for displaying list of all products
def product
@product = Product.new(params[:page])
respond_to do |format|
if @product.save
@prods = Product.find(:all)
flash[:product] = "Product #{params[:pname]} saved successfully"
else
format.html { render :controller => "pages", :action => "product" }
format.xml { render :xml => @product.errors, :status => :unprocessable_entity }
end
end
@prods = Product.find(:all)
flash[:product] = "Currently there are #{@prods.size} products"
end
查看:
<!--show form-->
<% form_for(@product) do |p| %>
<%= p.error_messages %>
<tr><td><%=p.label 'Product*'%></td>
<td><%=p.text_field :prod_name%></td>
</tr>
<tr><td><%=p.label 'Product Price*'%></td>
<td><%=p.text_field :prod_orig_price%></td>
</tr>
<tr>
<td><%=p.label 'Product Discount'%></td>
<td><%=p.text_field :prod_dis_per%></td>
</tr>
<tr>
<td><%=p.label 'Product Promo Code'%></td>
<td><%=p.text_field :prod_promo%></td>
</tr>
<tr align="center"><td colspan="4"><%= submit_tag "Add Product" %></td>
</tr>
</table>
<%end%>
<!--show table-->
<%if @prods != nil%>
<tr>
<th>Product Name</th>
<th>Product Price</th>
<th>Product Discount</th>
<th>Product Promocode</th>
</tr>
<% for p in @prods%>
<tr>
<td><%=p.prod_name%></td>
<td><%=p.prod_orig_price%></td>
<td><%=p.prod_dis_price%></td>
<td><%=p.prod_promo%></td>
</tr>
<%end%>
<%end%>
第一次在页面周围加载正常。我看到表格,我看到桌子上有人工产品。但是,当我尝试将所有字段留空时,我可以看到验证工作然后我看到一条消息
uninitialized constant ProductsController
我有
我的routes.rb中map.resources :products
我的rails版本是2.3.5。
我已经有一段时间了。我确信我缺少一些基本的东西,因为我缺乏对rails框架的不足。
答案 0 :(得分:1)
这里有很多事情要做,但为了解决你应该做的直接问题:
index
操作def product
上方的代码移至新的def index
操作。/pages/products.html.erb
移至/products/index.html.erb
。我要编辑这个来解释原因,但是现在这应该让你开始。
原因!
当您在routes.rb
中定义一个restful资源时,例如通过编写map.resources :products
,rails希望您以一种宁静的方式编写控制器。这对您意味着,如果您需要产品资源,则需要ProductsController
并执行以下操作(您只需实施所需的操作):index, show, new, create, edit, update, delete
。这可以解释为什么你的代码无效。
我不确定你routes.rb
的内容是什么,但我猜你仍然定义了默认路由,这可以解释为什么你可以浏览到/pages/products
。
当您使用form_for(@product)
时,会生成<form action="/products" method="post">
,这会映射到您的new
操作。
说完这一切后,我建议你做以下事情:
/new
页面,您可以随时<%= render :partial => 'form' %>
在其他操作中共享新的产品功能。这将有助于测试并使代码更易于维护。Rails可以有一个非常陡峭的学习曲线,但有很多文献可以帮助你。我希望这个答案能指出你正确的方向并给你一些思考。
答案 1 :(得分:0)
除非您未包含所有相关代码,否则product
方法缺少respond_to
块:
respond_to do |format|
format.html { render :controller => "pages", :action => "product" }
format.xml { render :xml => @product.errors, :status => :unprocessable_entity
end