2010-03-18 6 views
2

J'essaye de créer un formulaire pour une ressource imbriquée. Voici mon itinéraire:Quelle est la syntaxe form_for pour les ressources imbriquées?

map.resources :websites do |website| 
    website.resources :domains 
end 

Voici mes tentatives et les erreurs:

<% form_for(@domain, :url => website_domains_path(@website)) do | form | %> 
<%= form.text_field :name %> 

# ArgumentError: wrong number of arguments (1 for 0) 
# form_helper.rb:290:in 'respond_to?' 
# form_helper.rb:290:in 'apply_form_for_options!' 
# form_helper.rb:277:in 'form_for' 

<% form_for([@website, @domain]) do | form | %> 
<%= form.text_field :name %> 

# ArgumentError: wrong number of arguments (1 for 0) 
# form_helper.rb:290:in 'respond_to?' 
# form_helper.rb:290:in 'apply_form_for_options!' 
# form_helper.rb:277:in 'form_for' 

<% form_for(:domain, @domain, :url => website_domains_path(@website)) do | form | %> 
<%= form.text_field :name %> 

# ArgumentError: wrong number of arguments (1 for 0) 
# wrapper.rb:14:in 'respond_to?' 
# wrapper.rb:14:in 'wrap' 
# active_record_helper.rb:174:in 'error_messages_for' 

<% form_for(:domain, [@website, @domain]) do | form | %> 
<%= form.text_field :name %> 

# UndefinedMethodError 'name' for #<Array:0x40fa498> 

J'ai confirmé que les deux @website et @domain contiennent des instances de la classe correcte.

Les routes aussi générer correctement est utilisé comme ceci par exemple, donc je ne pense pas que leur problème avec l'aide de route ou url.

<%= website_domains_path(1) %> 
<%= website_data_source_path(1, 1) %> 

Rails 2.3.5

Répondre

1

Vous pouvez utiliser

<%= form_for [@website, @domain] %> 

@domain appartient à @website

+0

Même si la solution à mon problème est la bonne réponse à la question et je préférerais attribuer les points à quelqu'un d'autre que moi-même! – Kris

+0

'for_for' ->' form_for' (je n'étais pas capable de modifier directement) – static

1

J'ai juste essayé:

<% form_for @note, :url => teams_person_notes_path(@person) do |f| %> 
    <%= f.text_field :note %> 
    <%= f.submit "Add" %> 
<% end %> 

et il fonctionne sans aucun problème. Mes itinéraires ressemble à ceci:

map.namespace :teams do |t| 
    t.resources :people do |p| 
     p.resources :notes 
    end 
    end 

Il est le même que le vôtre (seulement l'espace de noms est ajouté, mais ce n'est pas un cas).

Bien sûr, votre exemple de formulaire concerne un nouvel objet de @domain. Il ne fonctionnera pas pour une action d'édition, alors vous devriez avoir:

<% form_for @domain, :url => edit_website_domain_path(@website, @domain) do |form| %> 
+0

Cela pourrait être un problème plus profond que j'ai d'abord pensé. L'exemple de formulaire est pour un nouvel objet, à savoir. @ domain.new_record? # => true. – Kris

+0

Je pense que votre deuxième exemple devrait également fonctionner, mais à la fois pour le nouveau et éditer. Donc, vous avez probablement une erreur ailleurs. Avez-vous tous les blocs fermés avec 'end'? Ou, essayez de supprimer tous les champs du formulaire. – klew

0

C'était si évident quand il a finalement cliqué, j'avais un champ appelé respond_to. C'était bien sûr passer outre une méthode existante.

une honte ActiveRecord ne prévient pas quand une colonne de base de données écrasera une méthode déjà défini ...

Questions connexes