76 votes

Ruby on Rails: Soumettre un tableau dans un formulaire

J'ai un modèle qui possède un attribut est un Tableau. Quelle est la bonne manière pour moi de remplir cet attribut de la soumission d'un formulaire?

Je sais que d'avoir un formulaire avec un champ dont le nom comprend des crochets crée une table de hachage à partir de l'entrée. Devrais-je prendre et marcher à travers elle dans le contrôleur de massage dans un tableau?

Exemple pour le rendre moins abstrait:

class Article
  serialize :links, Array
end

Les liens variable prend la forme d'un tableau d'Url, c'est à dire [["http://www.google.com"], ["http://stackoverflow.com"]]

Lorsque j'utilise quelque chose comme ce qui suit dans mon formulaire, il crée une table de hachage:

<%= hidden_field_tag "article[links][#{url}]", :track, :value => nil %>

La résultante de hachage ressemble à ceci:

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

Si je ne suis pas d'inclure l'adresse url dans le nom du lien, des valeurs supplémentaires pour tabasser les uns des autres:

<%= hidden_field_tag "article[links]", :track, :value => url %>

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

96voto

Larry K Points 16266

Si votre formulaire html a des champs de saisie avec des accolades vides, alors ils seront transformés en un tableau à l'intérieur params dans le contrôleur.

# Eg multiple input fields all with the same name:
<input type="textbox" name="course[track_codes][]" ...>

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

Ajouté:

Notez que les rails, les accompagnateurs sont pas d'installation à faire le tableau astuce auto-magiquement. Ainsi, vous pourriez avoir à créer le nom des attributs manuellement. Aussi, les cases à cocher ont leurs propres problèmes si vous utilisez les rails aides depuis la case aides de créer d'autres champs cachés pour gérer la décoché cas.

62voto

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

9voto

Ana Franco Points 146

J'ai également découvert que, si vous réussissiez votre assistant de saisie comme ceci, vous obtiendrez un tableau de cours, chacun avec ses propres attributs.

 # Eg multiple input fields all with the same name:
<input type="textbox" name="course[][track_codes]" ...>

# will become the Array 
   params["course"]

# where you can get the values of all your attributes like this:
   params["course"].each do |course|
       course["track_codes"]
   end    
 

8voto

Peter Ehrlich Points 2415

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

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

J'ai écrit une extension simple_form personnalisée

 # 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 café:

 $('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
 

0voto

sovanlandy Points 562

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 devrez 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 dans le champ votre tableau

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X