2010-05-30 11 views
0

J'essaie de créer une application de backlog de produit simple pour m'enseigner Rails. Pour chaque produit, il peut y avoir plusieurs entrées de backlog produit. Je souhaite donc créer une vue de produit qui affiche les informations sur le produit, toutes les entrées de backlog pour le produit et inclut un formulaire imbriqué pour ajouter plus d'entrées de backlog.Problème de formulaire imbriqué dans Rails: NoMethodError dans Afficher

Tout fonctionne jusqu'à ce que j'essaie d'ajouter la forme à la vue, ce qui entraîne alors l'erreur suivante:

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

La vue du produit où le problème est signalé comme suit (les travaux partiels bien, donc Je ne vais pas inclure ce code):

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

C'est le modèle du produit:

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

Ce modèle est le ProductBacklog:

class ProductBacklog < ActiveRecord::Base 
    belongs_to :product 
end 

Ce sont les routes:

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

Toutes les colonnes existent dans le schéma pour ce modèle:

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 

J'ai vérifié ce que je Je fais contre le Creating a weblog in 15 minutes with Rails 2 screencast, et en principe je semble faire la même chose que lui - seuls ses commentaires imbriqués fonctionnent, et les miens non!

J'espère que quelqu'un peut aider avec ceci, avant que je devienne fou! Je suis sûr que c'est quelque chose de trivial.

Répondre

0

La solution a consisté à remplacer la ligne:

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

avec:

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

Notez l'espace après form_for et les crochets.

1

Il semble que vous n'ayez pas le champ pblog_ref dans votre modèle. Jetez un oeil sur la migration qui a créé la table des produits, y a-t-il un champ pblog_ref?

EDIT: Ok , il semble que cette ligne est faux:

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

Il crée pour votre @product pas ProductBacklog.new. Essayez:

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

J'ai toujours des problèmes avec form_for arguments avec certains modèles imbriqués, donc je préfère utiliser accepts_nested_attributes_for puis créer avec fields_for sous-objets.

Dans votre cas form_for devrait ressembler à ceci:

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

Cependant, je ne pas vérifier et il est probablement faux (comme je l'ai dit que je l'ai toujours des problèmes avec les chemins).

+0

Oui, il y a. Désolé, j'ai oublié d'inclure les détails de la table dans le schéma (maintenant ajouté ci-dessus). Tous les champs sont là. Lorsque je supprime les lignes se référant à pblog_ref, l'erreur se déplace sur la ligne f.text_field: product. – Brian

+0

@brianheys: J'ai édité ma réponse. Est-ce que cela résout le problème? – klew

+0

Merci pour votre aide. J'ai réussi à résoudre le problème maintenant. Voir ma réponse ci-dessous. – Brian

1

vérifier votre base de données, peut-être une certaine migration a échoué et vous avez seulement une partie des champs là-bas

vous pouvez également vérifier avec l'exécution script/console d'abord, puis l'émission « p Product.new ».Il vous montrera un vide objet produit avec tous les champs connus, comme:

#./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 
+0

J'ai vérifié la base de données et les colonnes sont toutes là. Cependant, quand j'essayer de faire ce qui précède, j'obtiens ce qui suit ... p.Product.new NoMethodError: méthode non définie Produit » pour nul: NilClass \t de /System/Library/Frameworks/Ruby.framework/Versions /1.8/usr/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/whiny_nil.rb:52:in 'method_missing ' \t from (irb): 2 Même lorsque j'essaie de fais p.ProductBacklog.new – Brian