2010-10-07 22 views
0

J'ai un formulaire d'événement avec des modèles d'attributs imbriqués. Les modèles supplémentaires sont rendus après la sélection d'un client dans une zone de sélection. Un observateur surveille et appelle une action de contrôleur qui rend un partiel contenant les champs_ pour les modèles imbriqués. Le problème que je rencontre est que je ne peux pas passer le bloc 'form' de l'événement à la partie nouvellement rendue - au moins je ne peux pas comprendre comment ...Passage d'un objet de formulaire à un rendu partiel à partir d'une requête ajax

Le code ci-dessous soulève l'erreur: "mal nombre d'arguments (0 pour 1) ". Toute aide ou suggestion est appréciée. Comme mentionné ci-dessous, je suis également prêt à ré-implémenter ceci en utilisant JavaScript discret si vous pouvez fournir un exemple pour ce scénario.

Formulaire événement:

<%- form_for @event do |form| %> 

    <%= select_tag :id=>event_client_id %> 
    <%= observe_field :event_client_id, url => {:action => 'client_questions'}, :with => "'client_id=' + encodeURIComponent(value)+'&event_id='+#{@event.id} %> 

Contrôleur événement

def client_questions 
    @event = Event.find(params[:event_id]) 
    @client = Client.find(params[:client_id]) 
    @client_questions = @client.questions.active 
    respond_to do |format| 
    format.js { 
     render :update do |page| 
     page[:client_questions].replace_html :partial => 'client_questions', :layout => false 
     end 
    } 
    end 
end 

_client_questions.html.erb partielle

<%- form.fields_for :client, @client do |client| %> 
    <%= client_text_field :name %> 

    <%- client.fields_for :questions do |question| %> 
    <%=question.text_field :content %> 
+0

Un conseil: utilisez javascript discret http://en.wikipedia.org/wiki/Unobtrusive_JavaScript – marcgg

+0

Je suis prêt à faire ce changement. Pouvez-vous donner un exemple pour ce scénario? J'utilise évidemment un prototype dans cette application, donc vous pouvez tirer parti de cette bibliothèque. –

+0

L'utilisation de js non intrusif ne fait aucune différence dans ce scénario. Bien qu'il soit considéré comme une meilleure pratique, il n'est pas pertinent ici. Je voudrais que cette application soit discrète mais comme j'ai hérité du code de quelqu'un d'autre, je n'avais pas ce choix. –

Répondre

3

Ainsi, votre principale forme est rendu dans une action, et vous êtes en espérant passer l'objet formulaire de cette vue, à une autre vue rendue dans un second partiel? Ce n'est pas quelque chose que vous pouvez faire, mais vous pouvez modifier votre code de la vue dans le partiel rendu la deuxième fois, de sorte qu'il rend sans avoir besoin de l'objet de forme actuelle, quelque chose comme:

<%- fields_for "event[client_attributes]", @client do |client| %> 
    <%= client_text_field :name %> 

    <%- client.fields_for :questions do |question| %> 
    <%= question.text_field :content %> 

Je n'ai pas exécuter ce code pour le tester, comparez donc le code html qu'il génère avec le code html que votre partial existant générerait s'il était rendu dans la même action que le formulaire principal.

+0

Bonne idée! Je vais essayer ça. Je reviendrai sur mes progrès et je verrai si cela fonctionne. –

+0

Cela fonctionne avec un petit changement. Il doit lire "event [client_attributes]", .... parce que c'est un modèle d'attribut imbriqué –

+0

Content d'entendre Nate, je mettrai à jour la réponse pour d'autres références. – Jeremy