繁体   English   中英

Rails中的嵌套表单问题:Show中的NoMethodError

[英]Nested form problem in Rails : NoMethodError in Show

我正在尝试构建一个简单的产品积压应用程序以自学Rails。 对于每个产品,可以有多个产品待办事项条目,因此我想创建一个产品视图,以显示产品信息,该产品的所有待办事项条目,并包括用于添加更多待办事项条目的嵌套表单。

一切正常,直到我尝试将表单添加到视图中,然后导致以下错误:

NoMethodError in Products#show

Showing app/views/products/show.html.erb where line #29 raised:

undefined method `pblog_ref' for #<Product:0x10423ba68>
Extracted source (around line #29):

26:   <%= f.error_messages %>
27:   <p>
28:     <%= f.label :pblog_ref %><br />
29:     <%= f.text_field :pblog_ref %>
30:   </p>
31:   <p>
32:     <%= f.label :product %><br />

报告问题的产品视图如下所示(部分工作正常,因此我将不包含该代码):

<h1>Showing product</h1>

<p>
  <b>Product ref:</b>
  <%=h @product.product_ref %>
</p>
<p>
  <b>Description:</b>
  <%=h @product.description %>
</p>
<p>
  <b>Owner:</b>
  <%=h @product.owner %>
</p>
<p>
  <b>Status:</b>
  <%=h @product.status %>
</p>

<h2>Product backlog</h2>
<div id="product-backlog">
  <%= render :partial => @product.product_backlogs %>
</div>

<% form_for(@product, ProductBacklog.new) do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :pblog_ref %><br />
    <%= f.text_field :pblog_ref %>
  </p>
  <p>
    <%= f.label :product %><br />
    <%= f.text_field :product %>
  </p>
  <p>
    <%= f.label :description %><br />
    <%= f.text_field :description %>
  </p>
  <p>
    <%= f.label :owner %><br />
    <%= f.text_field :owner %>
  </p>
  <p>
    <%= f.label :status %><br />
    <%= f.text_field :status %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

<%= link_to 'Edit', edit_product_path(@product) %> |
<%= link_to 'Back', products_path %>

这是产品模型:

class Product < ActiveRecord::Base
  validates_presence_of :product_ref, :description, :owner
  has_many :product_backlogs
end

这是ProductBacklog模型:

class ProductBacklog < ActiveRecord::Base
  belongs_to :product
end

这些是路线:

  map.resources :product_backlogs
  map.resources :products, :has_many => :product_backlogs

该模型的模式中存在所有列:

create_table "product_backlogs", :force => true do |t|
  t.string   "pblog_ref"
  t.integer  "product_id"
  t.string   "description"
  t.string   "owner"
  t.string   "status"
  t.datetime "created_at"
  t.datetime "updated_at"
end

我已经检查了我在15分钟内通过Rails 2屏幕录像创建一个Weblog所做的事情,并且原则上我似乎在和他做同样的事情-只有他的嵌套评论表单有效,而我的则不行!

希望在我生气之前,有人可以帮助您! 我敢肯定这是微不足道的。

看来您的模型中没有pblog_ref字段。 查看创建产品表的迁移,是否有pblog_ref字段?

编辑:好的,看来这行是错误的:

<% form_for(@product, ProductBacklog.new) do |f| %>

它为您的@product创建表单,而不为ProductBacklog.new创建表单。 尝试:

<% form_for(ProductBacklog.new) do |f| %>

对于某些嵌套模型, form_for参数总是存在问题,因此我更喜欢使用accepts_nested_attributes_for然后使用fields_for创建子对象。

在您的情况下, form_for应该如下所示:

<% form_for ProductBacklog.new, :url => new_product_product_backlog_path(@product) do |f| %>

但是我没有检查它,这可能是错误的(因为我说过这些路径总是有问题)。

检查您的数据库,也许某些迁移失败,并且那里只有部分字段

您也可以先检查运行脚本/控制台 ,然后发出“ p Product.new ”。 它将向您显示一个空的Product对象,其中包含所有已知字段,例如:

#./script/console
Loading development environment (Rails 2.3.5)
>> p User.new
#<User id: nil, type: nil, login: nil, name: "", email: nil, crypted_password: nil, salt: nil, created_by_id: nil, created_at: nil, updated_at: nil, remember_token: nil, remember_token_expires_at: nil, male: true, dept_id: nil, deleted: nil>
=> nil

解决方案是替换该行:

<% form_for(@product, ProductBacklog.new) do |f| %>

有:

<% form_for [@product, ProductBacklog.new] do |f| %>

请注意form_for之后的空格和方括号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM