복붙노트

[RUBY-ON-RAILS] 루비 온 레일즈 : 형태로 배열 제출

RUBY-ON-RAILS

루비 온 레일즈 : 형태로 배열 제출

나는 배열 인 속성이 모델을 가지고있다. 양식 제출에서 해당 속성을 채울 수 나를 위해 적절한 방법은 무엇입니까?

I 이름 브래킷을 포함하는 입력으로부터의 해시를 생성하는 필드 양식 입력을 갖는 것을 알고있다. 난 그냥 그것을 복용하고 배열로 마사지 컨트롤러에 단계별로해야 하는가?

예 덜 추상적 만들려면 :

class Article
  serialize :links, Array
end

링크 변수 (A)의 URL을 배열, 즉 [ "http://www.google.com"], [ "http://stackoverflow.com"]을 형태를 취

나는 내 양식에 다음과 같은 것을 사용하면 해시를 생성합니다 :

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

생성 된 해시는 다음과 같습니다 :

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

내가 링크의 이름에 URL을 포함하지 않는 경우, 추가 값은 서로 소지품 :

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

이 같은 결과 외모 : "링크"=> "http://stackoverflow.com"

해결법

  1. ==============================

    1.당신의 HTML 양식이 빈 대괄호로 입력 필드를 가지고 있다면, 그들은 컨트롤러에 PARAMS 내부 배열로 설정됩니다.

    당신의 HTML 양식이 빈 대괄호로 입력 필드를 가지고 있다면, 그들은 컨트롤러에 PARAMS 내부 배열로 설정됩니다.

    # 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
    

    추가 :

    레일 도우미가 자동 마술 배열 트릭을하도록 설정되지 않습니다. 수동으로 이름 속성을 만들어야 할 수도 있습니다 그래서. 체크 박스 도우미가되지 않은 경우를 처리하기 위해 추가 숨겨진 필드를 만들 수 있기 때문에 레일 헬퍼를 사용하는 경우 또한, 체크 박스는 자신의 문제를 가지고있다.

  2. ==============================

    2.

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

    3.TL; HTML [] 협약 DR 버전 :

    TL; HTML [] 협약 DR 버전 :

    <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 수신 :

    { course: { track_codes: ['a', 'b', 'c'] } }
    
    <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 수신 :

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

    4.나는 또한이처럼 입력 도우미를 통과 할 경우 교육 과정의 배열을 자신의 속성과 각 하나를 얻을 것이다 것을 발견했습니다.

    나는 또한이처럼 입력 도우미를 통과 할 경우 교육 과정의 배열을 자신의 속성과 각 하나를 얻을 것이다 것을 발견했습니다.

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

    5.난 그냥 JQuery와 taginput를 사용하여 솔루션을 설정 :

    난 그냥 JQuery와 taginput를 사용하여 솔루션을 설정 :

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

    나는 사용자 정의 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
    

    coffeescrpt 조각 :

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

    그리고 슬프게도이 내 컨트롤러에 팅겨 약간 구체적으로 :

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

    6.간단한 양식을 사용하는 사람들을 위해, 당신은이 솔루션을 고려할 수 있습니다. 기본적으로 자신의 입력을 설정할 필요로 사용 : 배열입니다. 그런 다음 컨트롤러 레벨에서 입력을 처리해야합니다.

    간단한 양식을 사용하는 사람들을 위해, 당신은이 솔루션을 고려할 수 있습니다. 기본적으로 자신의 입력을 설정할 필요로 사용 : 배열입니다. 그런 다음 컨트롤러 레벨에서 입력을 처리해야합니다.

    #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
    

    귀하의 경우에는 단지 변경 : premium_keyword을 배열 필드

  7. from https://stackoverflow.com/questions/3089849/ruby-on-rails-submitting-an-array-in-a-form by cc-by-sa and MIT license