在轨道上需要另一组眼睛 - 验证问题

时间:2010-01-27 16:23:48

标签: ruby-on-rails

我有一个简单的表单,它接受一些字段并将它们添加到数据库中。表单下方是一个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框架的不足。

2 个答案:

答案 0 :(得分:1)

这里有很多事情要做,但为了解决你应该做的直接问题:

  1. 脚本/生成控制器产品
  2. 在产品控制器中创建index操作
  3. 将您def product上方的代码移至新的def index操作。
  4. 将您的观点从/pages/products.html.erb移至/products/index.html.erb
  5. 我要编辑这个来解释原因,但是现在这应该让你开始。

    原因!

    当您在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操作。

    说完这一切后,我建议你做以下事情:

    1. 阅读Rails resources
    2. 重新构建您的应用程序以使其更加安静,例如,为显示表单的产品提供专用的/new页面,您可以随时<%= render :partial => 'form' %>在其他操作中共享新的产品功能。这将有助于测试并使代码更易于维护。
    3. 查看Inherited resources插件。它将引导您朝着正确的方向前进,并希望能够避免编写大量代码。
    4. 查看formtastic插件。它将帮助您创建语义正确的表格,减少锅炉铭牌代码,让您的生活更轻松。
    5. 阅读rails partials。这有助于您收紧观点。
    6. 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