Ruby on Rails: Soumission d’un tableau dans un formulaire

J’ai un modèle qui a un atsortingbut qui est un tableau. Quelle est la bonne façon pour moi de remplir cet atsortingbut à partir d’une soumission de formulaire?

Je sais que la saisie d’un formulaire avec un champ dont le nom contient des crochets crée un hachage à partir de l’entrée. Dois-je simplement prendre ça et le parcourir dans le contrôleur pour le transformer en un tableau?

Exemple pour le rendre moins abstrait:

class Article serialize :links, Array end 

La variable de liens prend la forme d’un tableau d’URL, à savoir [["http://www.google.com"], ["http://stackoverflow.com"]]

Lorsque j’utilise quelque chose comme le suivant dans mon formulaire, cela crée un hachage:

  nil %> 

Le hash résultant ressemble à ceci:

 "links" => {"http://www.google.com" => "", "http://stackoverflow.com" => ""} 

Si je n’inclus pas l’URL dans le nom du lien, des valeurs supplémentaires se chevauchent:

  url %> 

Le résultat ressemble à ceci: "links" => "http://stackoverflow.com"

Si votre formulaire HTML contient des champs d’entrée avec des crochets vides, ils seront transformés en un tableau à l’intérieur des parameters du contrôleur.

 # Eg multiple input fields all with the same name:  # will become the Array params["course"]["track_codes"] # with an element for each of the input fields with the same name 

Ajoutée:

Notez que les helpers des rails ne sont pas configurés pour faire du tableau un truc auto-magique. Vous devrez donc créer les atsortingbuts de nom manuellement. De plus, les cases à cocher ont leurs propres problèmes si vous utilisez les aides de rails car les aides de la case à cocher créent des champs masqués supplémentaires pour gérer le cas non vérifié.

 = simple_form_for @article do |f| = f.input_field :name, multiple: true = f.input_field :name, multiple: true = f.submit 

TL; version DR de la convention HTML [] :

Tableau:

    

Paramètres reçus:

 { course: { track_codes: ['a', 'b', 'c'] } } 

Hacher

    

Paramètres reçus:

 { course: { track_codes: { x: 'a', y: 'b', z: 'c' } } 

J’ai également découvert que si vous réussissez votre aide à la saisie, vous obtiendrez un tableau de cours avec chacun ses propres atsortingbuts.

 # Eg multiple input fields all with the same name:  # will become the Array params["course"] # where you can get the values of all your atsortingbutes like this: params["course"].each do |course| course["track_codes"] end 

Je viens de mettre en place une solution en utilisant jquery taginput:

http://xoxco.com/projects/code/tagsinput/

J’ai écrit une extension personnalisée simple_form

 # for use with: http://xoxco.com/projects/code/tagsinput/ class TagInput < SimpleForm::Inputs::Base def input @builder.text_field(attribute_name, input_html_options.merge(value: object.value.join(','))) end end 

Un extrait de coffeescrpt:

 $('input.tag').tagsInput() 

Et un tweak à mon contrôleur, qui doit malheureusement être légèrement spécifique:

 @user = User.find(params[:id]) attrs = params[:user] if @user.some_field.is_a? Array attrs[:some_field] = attrs[:some_field].split(',') end 

Pour ceux qui utilisent un formulaire simple, vous pouvez envisager cette solution. Fondamentalement, vous devez configurer votre propre entrée et l’utiliser comme: array. Ensuite, vous devez gérer les entrées au niveau de votre contrôleur.

 #inside lib/utitilies class ArrayInput < SimpleForm::Inputs::Base def input @builder.text_field(attribute_name, input_html_options.merge!({value: object.premium_keyword.join(',')})) end end #inside view/_form ... = f.input :premium_keyword, as: :array, label: 'Premium Keyword (case insensitive, comma seperated)' #inside controller def update pkw = params[:restaurant][:premium_keyword] if pkw.present? pkw = pkw.split(", ") params[:restaurant][:premium_keyword] = pkw end if @restaurant.update_attributes(params[:restaurant]) redirect_to admin_city_restaurants_path, flash: { success: "You have successfully edited a restaurant"} else render :edit end end 

Dans votre cas, changez simplement: premium_keyword au champ de votre tableau