2010-02-08 6 views
3

Quoi de plus simple dans Ruby-on-Rails de créer plusieurs champs cachés simples avec des valeurs connues et le même nom dans un certain nombre de formes non-modèle (form_remote_tag dans mon cas, mais je Je devine que ce n'est pas pertinent)?Champ caché simple sous forme non-modèle

Par « champ caché simple », je veux dire celui où le nom est une seule chaîne (field_name) plutôt qu'une partie d'un tableau (field_name[]), de sorte que la valeur peut être lue simplement à partir du hachage params comme params[:field_name] plutôt de params[:field_name][0].

j'ai trouvé que

<% form_remote_tag :url => {:action => "do_act"} do %> 
    <%= hidden_field :field_name, 0, :name => "field_name", :value => "foo" %> 
    <%= submit_tag "Submit" %> 
<% end %> 

produit un élément acceptable (<input id="field_name_0" name="field_name" type="hidden" value="foo" />), mais si j'omettre le paramètre :name alors le champ rendu a le nom field_name[0]. Omettre le 0 provoque évidemment un comportement vraiment étrange.

<%= hidden_field_tag :field_name, "foo" %> produit un élément acceptable s'il n'y en a qu'un seul, mais génère des avertissements HTML (ID dupliqués) s'il y en a plusieurs.

Existe-t-il un moyen de le faire (sauf en définissant un assistant) en moins d'arguments?

Répondre

6

J'utiliser hidden_field_tag et définir l'ID manuellement en fonction une valeur différente pour chaque forme. Comme ceci:

<%= hidden_field_tag :field_name, 'value', :id => 'field_name_' + unique_value %> 

unique_value peut être rien du tout. Si ces formulaires ont une sorte d'enregistrement parent auquel ils se réfèrent, cela pourrait être l'ID du parent. Je suppose que c'est la raison pour laquelle vous avez plusieurs formulaires similaires sur la même page en premier lieu.

1

Essayez hidden_field_tag:

<%= hidden_field_tag :field_name, "foo" %> 
+0

Ah, ça marche - mais me rends compte que j'ai fait mon sous-estimés question. J'ai en fait un certain nombre de formes, toutes soumises à la même action avec des valeurs différentes dans le champ caché - donc cela génère des avertissements parce que les identifiants d'entrée sont les mêmes. – Chowlett

3

Vous pouvez simplement transmettre l'ID en tant qu'option. La méthode (form_tag_helper.rb) est définie comme:

def hidden_field_tag(name, value = nil, options = {}) 
    text_field_tag(name, value, options.stringify_keys.update("type" => "hidden")) 
end 

donc écrit:

<%= hidden_field_tag :field_name, "foo", :id => "hidden_field_1" %> 
<%= hidden_field_tag :field_name, "bar", :id => "hidden_field_2" %> 

Produit:

<input id="hidden_field_1" name="field_name" type="hidden" value="foo" /> 
<input id="hidden_field_2" name="field_name" type="hidden" value="bar" />