Проблема вложенной формы в Rails: NoMethodError в Show - PullRequest
0 голосов
/ 30 мая 2010

Я пытаюсь создать простое приложение для работы с продуктами, чтобы научить себя 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 screencast , и в принципе я, похоже, делаю то же самое, что и он, - только его вложенные формы комментариев работает, а мой нет!

Я надеюсь, что кто-то может помочь с этим, прежде чем я сойду с ума! Я уверен, что это что-то тривиальное.

Ответы [ 3 ]

1 голос
/ 30 мая 2010

проверьте вашу базу данных, возможно, какая-то миграция не удалась, и у вас есть только часть полей там

Вы также можете проверить, запустив сначала script / console , а затем введите " 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
1 голос
/ 30 мая 2010

Похоже, что в вашей модели нет поля pblog_ref. Посмотрите на миграцию, которая создала таблицу продуктов, есть ли поле pblog_ref?

EDIT: Хорошо, похоже, что эта строка неверна:

<% 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| %>

Однако я не проверял это, и это, вероятно, неправильно (как я сказал, у меня всегда есть проблемы с этими путями).

0 голосов
/ 30 мая 2010

Решением было заменить строку:

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

с:

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

Обратите внимание на пробел после form_for и квадратные скобки.

...