2010-07-19 3 views
1

Ive a créé un modèle imbriqué à partir de l'exemple RailsCasts Nested Model Form Part 2 et l'a fait fonctionner avec Rails 3 et JQuery. Actuellement, un utilisateur peut créer un nouveau projet et cliquer sur un lien pour ajouter de nouvelles tâches, et dans chaque nouvelle tâche, cliquer sur un lien qui lui permettra d'ajouter de nouvelles affectations à chaque tâche. Voici le lien pour créer une nouvelle tâche (le lien pour créer de nouvelles affectations est similaire):Création automatique d'un modèle imbriqué à l'aide de l'assistant 'link_to_add_fields'

 <p><%= link_to_add_fields "Add task", f, :task %></p> 

qui fait référence à cette aide:

def link_to_add_fields(name, f, association) 
new_object = f.object.class.reflect_on_association(association).klass.new 
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder| 
    render(association.to_s.singularize + "_fields", :f => builder) 
end 
link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))end 

Il fonctionne comme ceci: En cliquant sur le lien, html est ajouté via JQuery qui affiche un champ de formulaire pour le nom de la tâche et un lien qui permet à un utilisateur d'ajouter de nouvelles affectations à la tâche. Ce que je voudrais faire, c'est que les formulaires d'affectation apparaissent à côté du champ du nom de la tâche - de sorte que l'utilisateur n'a pas besoin de cliquer sur un lien supplémentaire pour ajouter de nouvelles affectations à chaque tâche. Je peux y arriver lorsque la page charge par le contrôleur de projet:

1.times do 
    task = @product.tasks.build 
    1.times { task.assignments.build} 
end 

Cependant, comme Im en utilisant JQuery pour ajouter et supprimer HTML, le contrôleur ne sera pas appelé et les formulaires ne seront pas construire quand ' ajouter de nouvelles tâches.

Existe-t-il un moyen de «construire» automatiquement les champs d'affectation imbriqués (à partir de la partie partielle de la tâche) lorsque le nouveau champ de tâche est créé?

Voici mon partielle pour la forme de tâche qui est créé lorsqu'un utilisateur clique sur le lien « nouvelle tâche » sous la forme:

<div class = "fields"> 
<%= f.label :name, "Task name"%> 
<%= link_to_remove_fields "remove", f %><br /> 
<%= f.text_field :name %> 



<% f.fields_for :assignments do |builder| %> 
    <%= render 'assignment_fields', :f => builder %> 
<% end %> 

<p><%= link_to_add_fields "Add assignments", f, :assignments %></p> 

+0

Je ne sais pas si vous êtes toujours à la recherche d'une réponse, mais il y a eu une Railscast révisée sur ce http://railscasts.com/episodes/196-nested-model-form-revised~~V~~3rd – spullen

+0

Je voudrais aussi recommande d'utiliser la gemme [cocoon] (https://github.com/nathanvda/cocoon) pour gérer les parties de formulaire imbriquées. – spullen

Répondre

1

J'ai une situation similaire et je suis actuellement (comme vous) à la recherche d'une solution. De Rails 3 Source je trouve:

activerecord/lib/active_record/nested_attributes.rb:

# === One-to-many 
# 
# Consider a member that has a number of posts: 
# 
# class Member < ActiveRecord::Base 
#  has_many :posts 
#  accepts_nested_attributes_for :posts 
# end 
# 
# You can now set or update attributes on an associated post model through 
# the attribute hash. 
# 
# For each hash that does _not_ have an <tt>id</tt> key a new record will 
# be instantiated, unless the hash also contains a <tt>_destroy</tt> key 
# that evaluates to +true+. 

J'espère que cela vous donne des idées.

0

Vous pouvez simuler un clic du lien d'affectation d'affectations avec jQuery une fois le formulaire de tâche créé. De cette façon, vous ne dépendez pas du contrôleur de rails.

after_create_handler = function() { $('assignment add link identifier').click() } 
Questions connexes