2017-01-04 5 views
0

J'ai un formulaire qui contient des champs text_fields. L'un d'eux est le champ du code postal. Il dispose d'un bouton "Rechercher" qui appelle une action spécifique "search_zip_code" qui renvoie les valeurs d'adresses associées à ce champ. Comment puis-je appeler cette action dans un tag form_for? J'ai déjà essayé un form_tag imbriqué, mais l'action submit appelle la méthode: create. Si j'utilise un "link_to", je ne peux pas passer le code postal entré par l'utilisateur. Quelle est la meilleure approche pour cela?Comment appeler une action spécifique à l'intérieur d'un formulaire_for

<%= form_for(@model) do |m|%> 
    <%= m.label :field_1 %> 
    <%= m.text_field :field_1 %> 

    <%= m.label :field_2 %> 
    <%= m.text_field :field_2 %> 

    <div class="field"> 
    <%= form_tag("/search_zip_code", method: "get") do %> 
     <%= label_tag(:zip, "ZIP Code:") %> 
     <%= text_field_tag(:zip) %> 
    <%= submit_tag("Search") %> 
    <% end %> 
</div> 

<%= m.submit %> 
<% end %> 

Pourquoi l'action "/ search_zip_code" n'est pas atteint par le bouton submit_tag? Même si je change cette route en méthode: post, cela ne fonctionne pas.

Merci,

Guilherme

+0

Déplacer la balise de forme en dehors de la form_for et ajouter une télécommande: true à votre form_tag afin qu'il fait un ajax appelez votre contrôleur. Dans votre contrôleur, renvoyez javascript ou json et créez un fichier javascript avec les informations que vous souhaitez insérer dans votre formulaire_for. –

+1

La spécification HTML n'autorise pas les formes imbriquées. En utilisant des formulaires imbriqués, vous comptez sur l'analyse de slops et les résultats peuvent être incohérents. https://www.w3.org/TR/html5/forms.html#the-form-element – max

+0

Utilisez javascript à la place pour lier un gestionnaire d'événements à l'entrée. – max

Répondre

0

Alors les gars, selon https://launchschool.com/blog/the-detailed-guide-on-how-ajax-works-with-ruby-on-rails et vos suggestions, ma solution devrait ressembler à:

Mon principal _form.html.erb:

<%= form_for(@model) do |m|%> 
    <%= m.label :field_1 %> 
    <%= m.text_field :field_1 %> 

<%= m.label :field_2 %> 
<%= m.text_field :field_2 %> 

<div class="field"> 
    <%= m.label :zip %> 
    <%= m.text_field :zip %> 
    <input type="button" id="search" value="Search" > 
</div> 
<div id="address-data" style="display:none;"></div> 

<script type="text/javascript" charset="UTF-8"> 
    $("#search").click(function() { 
    $.ajax({ 
     url: '/search_zip_code?zip=' + m_zip.value, 
     type: 'get' 
    }); 
    }); 
</script> 

<%= m.submit %> 
<% end %> 

L'action du contrôleur:

def search_zip_code 
    @add_zip = search(params[:zip] 
    respond_to do |format| 
     format.js 
    end 
end 

Ensuite, je besoin d'un fichier search_zip_code.js.erb:

$('#address-data').html("<%= j (render 'form-zip') %>"); 
$('#address-data').slideDown(350); 

Le search_zip_code.html.erb, qui contient tout:

<%= render 'form-zip' %> 

Et enfin, le _form-zip.html. erb partielle:

<%= simple_form_for @add_zip, remote: true do |z| %> 
    <%= z.input :street %> 
<% end %> 

les bonnes nouvelles sont que le zip est param correctement transmises à la méthode search_zip_code.

Mais le partiel n'est pas rendu: j'ai mis des points d'arrêt dans tous ces fichiers erb. Le search_zip_code.js.erb est atteint, mais le search_zip_code.html.erb et, bien sûr, le _form-zip.html.erb ne le sont pas.

Ai-je raté quelque chose?

Merci!

Guilherme

0

Salut pouvez-vous essayer avec le code suivant pour la emboîtées

<%= form_for @object, url => { controller: 'controller', action: 'create', method: :get } do |f| %> 
    <%= f.text_field :first_name %> 
    <%= f.submit %> 
<% end %>