2010-06-14 4 views
1

Désolé pour le titre semi-générique, mais je suis encore assez nouveau à rails et ne pouvais pas penser à une manière succincte de poser la question.Rails a-et-appartient-à-plusieurs forme question

J'ai une configuration de base habtm modèle: un projet a de nombreuses ressources et une ressource peut avoir de nombreux projets. J'ai la configuration de la base de données et des modèles correctement, et je peux faire tout ce dont j'ai besoin via la console, mais j'ai du mal à tout traduire dans la vue.

Sur la vue show pour le projet, je souhaite créer une ressource et l'affecter automatiquement au projet en cours. Voici mon html de base:

<p> 
    <b>Name:</b> 
    <%=h @project.name %> 
</p> 

<h2>Equipment</h2> 
<ul> 
    <% @project.resources.each do |r| %> 
    <li><%=h r.name %></li> 
    <% end %> 
</ul> 
<h2>Add A Resource</h2> 
<% form_for(@project) do |f| %> 
    <%= f.error_messages %> 

    <p> 
    Resource Name:<br /> 
    <%= f.text_field :resources %> 
    </p> 
    <p> 
    <%= f.submit 'Create' %> 
    </p> 
<% end %> 

De toute évidence, cette forme ne fonctionnera pas, mais je suis à une perte pour quoi faire. J'ai cherché des exemples variés, mais je n'en ai pas trouvé un pour ce que j'essaie de faire ici.

Une chose que j'ai pensé était de changer le formulaire pour être form_for(Resource.new) et inclure une entrée cachée du @project.id. Et puis, lorsque le resource_controller gère le formulaire, vérifiez cet ID et allez à partir de là. Cela ressemble à un vilain kludge cependant.

Répondre

1

Je crois que vous devriez utiliser quelque chose comme

<% form_for(@project) do |f| %> 
    <%= f.error_messages %> 
    <% f.fields_for :resources do |resource_fields| %> 
     <%= resource_fields.text_field :name %>   
    <% end %> 
<% end %> 

mais je suis vraiment pas sûr! ;]

+0

Cela a aidé, je me rapproche! Dans mon project_controller, ce paramètre est passé: 'project' => {"resources" => {"name" => "Nouvelle ressource"}} 'Comment puis-je créer un nouvel objet Ressource à partir de ça? J'ai essayé "@new_resource = @ project.resources.build (params [: resources]) "mais cela n'a pas fonctionné Merci encore – swilliams

+1

Je crois que le droit est' @ project.resources.build (params [: projet] [: resources]) ' –

+0

Ha, ouais je l'ai juste deviné moi aussi Merci – swilliams

2

Si vous utilisez Rails 2.3 ou plus récent, vous pouvez essayer d'utiliser accept_nested_attributes_for pour que votre projet crée automatiquement la ressource lorsqu'elle reçoit les attributs d'une nouvelle ressource. Il a aussi l'avantage de ne pas avoir besoin de quelque chose de spécial ajouté à votre contrôleur.

Ryan Daigle a écrit an excellent intro to accepts_nested_attributes_for, et il y a aussi un railcast (# 196).

Je ne l'ai pas encore essayé avec une relation HABTM, mais j'imagine que cela fonctionnerait de manière similaire à l'exemple has_many.

+0

Cette méthode ne marche pas pour has_and_belongs_to_many. [Documenté par omission.] (Http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html) – Maarten