Tengo un modelo que tiene un atributo que es un Array. ¿Cuál es el camino correcto para mí para llenar ese atributo de envío de un formulario?

Sé que tener un formulario de entrada con un campo cuyo nombre incluye soportes crea un hash de la entrada. ¿Debo tomar eso y paso a paso a través de él en el controlador de masaje en una matriz?

Ejemplo, para hacer que sea menos abstracto:

class Article
  serialize :links, Array
end

Los enlaces variable toma la forma de una matriz de direcciones Url, es decir, [["http://www.google.com"], ["http://stackoverflow.com"]]

Cuando uso algo como lo siguiente en el formulario, se crea un hash:

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

El hash resultante se parece a esto:

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

Si yo no incluir la url en el nombre del enlace, valores adicionales a darle una paliza a cada uno de los otros:

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

El resultado se parece a esto: "links" => "http://stackoverflow.com"

6 Comentarios

  1. 88

    Si tu formulario html, tiene campos de entrada con corchetes vacíos, a continuación, se conviertan en una matriz dentro de parámetros en el controlador.

    # 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

    Añadido:

    Nota de que los rieles ayudantes son no el programa de instalación para hacer la matriz truco auto-mágicamente. Así que usted puede tener para crear el nombre atributos manualmente. También, casillas de verificación, tienen sus propios problemas si el uso de los rieles ayudantes desde la casilla de verificación ayudantes de crear más campos ocultos para manejar el desactivada caso.

    • Si usted se preocupa por el orden de los elementos de la matriz que se conservan y quieren ser realmente exigente en cuanto a las normas, puede ser vale la pena leer, esta pregunta. Suena como el HTML especificaciones implica, pero no está 100% claro, que el orden debe ser preservado, pero todos los navegadores parecen hacerlo.
    • html como <input name="course[track_codes][][field1]" multiple /><input name="course[track_codes][][field2]" multiple /> generará params {course: {track_codes: [{field1: "yourvalue", field2: "yourvalue"},{field1: "yourvalue", field2: "yourvalue"}]}}
  2. 51
    = simple_form_for @article do |f|
      = f.input_field :name, multiple: true
      = f.input_field :name, multiple: true
      = f.submit
    • Esto es lo que yo estaba buscando!
    • Esto es lo que yo estaba buscando, pero fue incapaz de hacer que funcione correctamente. Me han pedido ayuda herepero ten en cuenta que hay un tema pidiendo simple_form para apoyar a las matrices.
    • Por favor, agregue una explicación de lo que este código. Como esta la respuesta no es muy útil.
    • El aceptó la respuesta debe ser actualizado para incluir esta multiple: true actualización, que es claramente el camino a seguir.
    • f.input :name, input_html: { multiple: true } podría ser utilizado para la entrada
    • Nota: esta respuesta requiere de la simple_form gema: github.com/plataformatec/simple_form
    • f.input: name, multiple: true, value: ... también trabaja con guías nativos form_for @article do |f|

  3. 39

    TL;DR versión de HTML [] convención:

    Matriz:

    <input type="textbox" name="course[track_codes][]", value="a">
    <input type="textbox" name="course[track_codes][]", value="b">
    <input type="textbox" name="course[track_codes][]", value="c">

    Params recibido:

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

    Hash

    <input type="textbox" name="course[track_codes][x]", value="a">
    <input type="textbox" name="course[track_codes][y]", value="b">
    <input type="textbox" name="course[track_codes][z]", value="c">

    Params recibido:

    { course: { track_codes: { x: 'a', y: 'b', z: 'c' } }
    • es que hay una manera de usar simple_form para generar esos?
    • @FilipeEsperandio f.input "course[track_codes][x]"
  4. 8

    También he descubierto que si pase a su entrada auxiliar como esta usted va a obtener un conjunto de cursos, cada uno con sus propios atributos.

    # 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    
  5. 7

    He configurado una solución usando jquery taginput:

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

    Escribí una costumbre simple_form extensión

    # 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 coffeescrpt fragmento:

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

    Y un retoque a mi controlador, que tristemente tiene que ser ligeramente específicos:

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

    Para los que utilizan de forma simple, se puede considerar esta solución. Básicamente necesita para configurar su propia entrada y usarla como :la matriz. Entonces usted necesita para controlar la entrada en el controlador de nivel.

    #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

    En su caso sólo cambio :premium_keyword a la de su matriz campo

Dejar respuesta

Please enter your comment!
Please enter your name here