0

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

Rails 2スクリーンキャストを使用して15分でブログを作成することに対して私が行っていることを確認しました。原則として私は彼と同じことをしているようです-彼のネストされたコメントフォームのみが機能し、私のものは機能しません!

私が怒る前に、誰かがこれを手伝ってくれることを願っています!些細なことだと思います。

4

3 に答える 3

1

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

しかし、私はそれをチェックしなかったので、おそらく間違っています(私はいつもこれらのパスに問題があると言いました).

于 2010-05-30T07:49:39.860 に答える
1

データベースを確認してください。移行に失敗した可能性があり、そこにはフィールドの一部しかありません

最初にスクリプト/コンソールを実行してから、「 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
于 2010-05-30T07:59:22.167 に答える
0

解決策は、次の行を置き換えることでした。

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

と:

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

form_for の後のスペースと角括弧に注意してください。

于 2010-05-30T14:42:17.470 に答える