복붙노트

[RUBY-ON-RAILS] 올바르게 jQuery를 JSON에서 복호화되지 난간 (배열 정수 키 해시되고)

RUBY-ON-RAILS

올바르게 jQuery를 JSON에서 복호화되지 난간 (배열 정수 키 해시되고)

JSON의 배열이 레일에 jQuery를 개체 내가 게시 할 때마다, 나는이 문제가 있습니다. 내가 배열을 캐릭터 라인 화하면 내가 jQuery를이 일을 제대로하고있는 것을 볼 수있다 :

"shared_items"=>"[{\"entity_id\":\"253\",\"position\":1},{\"entity_id\":\"823\",\"position\":2}]"

하지만 난 그냥 얻을 AJAX 호출의 데이터로 배열을 보내는 경우 :

"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}

난 그냥 작동하는 일반 배열을 보내는 경우 반면 :

"shared_items"=>["entity_253"]

왜 레일은 이상한 해시 배열을 변화? 마음에 오는 유일한 이유는 어떤 유형이 여기에 없기 때문에 레일이 제대로 내용을 이해 할 수 없다는 것입니다 (JQuery와 통화에서 설정하는 방법이 있나요?)

Processing by SharedListsController#create as 

감사합니다!

최신 정보: I 배열이 아닌 데이터를 문자열로 보낸다 어레이 동적 .push () 함수를 사용하여 생성된다. .post $ 및 $ 아약스, 같은 결과를 시도했다.

해결법

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

    1.이시의 경우 누군가 비틀 거림에, 당신은 더 나은 솔루션은 "contentType의 '응용 프로그램 / JSON'"를 지정할 수 있습니다 원하는 아약스 통화 옵션과이 레일을 제대로 모든 -에 정수 키 입력 해시에 그것을 잘못 전달하지 않고 JSON 개체를 구문 분석 문자열 값.

    이시의 경우 누군가 비틀 거림에, 당신은 더 나은 솔루션은 "contentType의 '응용 프로그램 / JSON'"를 지정할 수 있습니다 원하는 아약스 통화 옵션과이 레일을 제대로 모든 -에 정수 키 입력 해시에 그것을 잘못 전달하지 않고 JSON 개체를 구문 분석 문자열 값.

    그래서, 요약, 내 문제는이 것이 었습니다 :

    $.ajax({
      type : "POST",
      url :  'http://localhost:3001/plugin/bulk_import/',
      dataType: 'json',
      data : {"shared_items": [{"entity_id":"253","position":1}, {"entity_id":"823","position":2}]}
    });
    

    레일로 일을 구문 분석 결과 :

    Parameters: {"shared_items"=>{"0"=>{"entity_id"=>"253", "position"=>"1"}, "1"=>{"entity_id"=>"823", "position"=>"2"}}}
    

    이 반면 (참고 : 우리가 지금 레일 우리의 문자열을 구문 분석하는 방법을 알 수 있도록 자바 스크립트 객체를 stringifying 및 콘텐츠 유형을 지정하고) :

    $.ajax({
      type : "POST",
      url :  'http://localhost:3001/plugin/bulk_import/',
      dataType: 'json',
      contentType: 'application/json',
      data : JSON.stringify({"shared_items": [{"entity_id":"253","position":1}, {"entity_id":"823","position":2}]})
    });
    

    레일에 좋은 객체 결과 :

    Parameters: {"shared_items"=>[{"entity_id"=>"253", "position"=>1}, {"entity_id"=>"823", "position"=>2}]}
    

    이 루비 1.9.3에 레일 3 나를 위해 작동합니다.

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

    2.약간,하지만 오래된 질문 나 자신이 오늘 싸웠다, 그리고 여기에 내가 생각 해낸 대답입니다 :이 약간 jQuery의 잘못이지만 만에 자연 일을 있다고 생각합니다. 내가 할, 그러나, 해결 방법을 가지고있다.

    약간,하지만 오래된 질문 나 자신이 오늘 싸웠다, 그리고 여기에 내가 생각 해낸 대답입니다 :이 약간 jQuery의 잘못이지만 만에 자연 일을 있다고 생각합니다. 내가 할, 그러나, 해결 방법을 가지고있다.

    다음 jQuery를 아약스 호출을 감안할 때 :

    $.ajax({
       type : "POST",
       url :  'http://localhost:3001/plugin/bulk_import/',
       dataType: 'json',
       data : {"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}]}
    
    });
    

    jQuery를 게시 할 값은 (당신이 당신의 방화범-의-선택에 요청 보면) 데이터를 형성 줄 것 같이 보일 것 같이 보인다 :

    shared_items%5B0%5D%5Bentity_id%5D:1
    shared_items%5B0%5D%5Bposition%5D:1
    

    당신은 당신이 얻을거야 CGI.unencode 경우

    shared_items[0][entity_id]:1
    shared_items[0][position]:1
    

    나는이 jQuery를 당신의 JSON에서 그 열쇠는 폼 요소 이름이 있다고 생각하기 때문에, 당신은 "사용자 [이름]"라는 이름의 필드를 가진 것처럼 그들을 치료해야한다고 생각합니다.

    그들은 당신의 레일 애플 리케이션에 와서 그래서, 레일 브래킷을보고하고, 필드 이름의 가장 안쪽의 키를 잡고 해시를 구성 (jQuery를은 "유용하게"추가 "1"것을).

    어쨌든, 나는 아약스 호출 다음과 같은 방법을 구성하여이 문제를 주변에있어;

    $.ajax({
       type : "POST",
       url :  'http://localhost:3001/plugin/bulk_import/',
       dataType: 'json',
       data : {"data": JSON.stringify({"shared_items": [{"entity_id":"253","position":1},{"entity_id":"823","position":2}])},
      }
    });
    

    어떤 힘 jQuery를이 JSON은 당신이 완전히 통과하려는 값, 그리고 그것을 받아 양식 필드 이름에 모든 키를 설정해야합니다 자바 스크립트 객체가 있다고 생각합니다.

    [: 데이터]를 명시 적으로 PARAMS에서 JSON을 디코딩 할 필요가 있기 때문에, 그 수단 것들, 레일 측면에 조금 다릅니다.

    하지만 괜찮아요 :

    ActiveSupport::JSON.decode( params[:data] )
    

    TL; DR : 따라서는, 상기 용액은 : 당신 jQuery.ajax () 호출에 대한 데이터 파라미터 수행 { "데이터"JSON.stringify (my_object)} 명시 대신이 추측 jQuery를 (로 JSON 배열 먹이 잘못 당신이 그것을 수행 할 작업.

  3. ==============================

    3.난 그냥 명시 적으로 액션 컨트롤러에있는 레일 가이드의 4.1 절을 참조 질문 ( "왜 레일이 이상한 해시 배열을 변화를")에 대답하기 위해 레일 (4)와 함께이 문제에 달렸다 :

    난 그냥 명시 적으로 액션 컨트롤러에있는 레일 가이드의 4.1 절을 참조 질문 ( "왜 레일이 이상한 해시 배열을 변화를")에 대답하기 위해 레일 (4)와 함께이 문제에 달렸다 :

    문제는 jQuery를 오히려 빈 대괄호보다 명시 적으로 배열 인덱스와 요청의 형식이다. 따라서, 예를 들어, 대신 shared_items [] = 1를 송신 shared_items [] = 2는 shared_items [0] = 1 shared_items [1] = 2를 전송한다. 이상한 루비 해시로 요청을 선회 어레이 인덱스와 해시 키보다는 배열 인덱스 들로서 해석들을 볼 레일 {shared_items를 {0 => '1', '1'=> '2'}}.

    클라이언트의 제어가없는 경우 배열에 해시를 변환하여 서버 측에서이 문제를 해결할 수 있습니다. 내가 그것을 어떻게 다음과 같습니다

    shared_items = []
    params[:shared_items].each { |k, v|
      shared_items << v
    }
    
  4. ==============================

    4.당신은 강한 매개 변수를 사용하는 경우 다음과 같은 방법이 도움이 될 수

    당신은 강한 매개 변수를 사용하는 경우 다음과 같은 방법이 도움이 될 수

    def safe_params
      values = params.require(:shared_items)
      values = items.values if items.keys.first == '0'
      ActionController::Parameters.new(shared_items: values).permit(shared_items: [:entity_id, :position]).require(:shared_items)
    end
    
  5. ==============================

    5.당신은 parsed_json = ActiveSupport을하고 :: JSON.decode (your_json_string) 생각 해 봤나? 당신이 물건을 다른 방법으로 전송하는 경우에는 데이터에는 직렬화하는 .to_json 사용할 수 있습니다에 대해.

    당신은 parsed_json = ActiveSupport을하고 :: JSON.decode (your_json_string) 생각 해 봤나? 당신이 물건을 다른 방법으로 전송하는 경우에는 데이터에는 직렬화하는 .to_json 사용할 수 있습니다에 대해.

  6. ==============================

    6.당신은 레일 컨트롤러 액션에 JSON 문자열을 얻으려고 노력하고 있습니까?

    당신은 레일 컨트롤러 액션에 JSON 문자열을 얻으려고 노력하고 있습니까?

    나는 해시하고있다하지 않도록 어떤 레일 해요,하지만 당신은 문제를 주변에 얻을 자바 스크립트 / JSON 객체를 생성 (JSON 문자열 반대) 및 전송하여 더 행운이있을 수 있습니다 그 통해 아약스의 데이터를 매개 변수로 요구.

    myData = {
      "shared_items":
        [
            {
                "entity_id": "253",
                "position": 1
            }, 
            {
                "entity_id": "823",
                "position": 2
            }
        ]
      };
    

    당신이 아약스를 통해이를 보내려는 경우에 당신은 이런 짓을 할 것이다 :

    $.ajax({
        type: "POST",
        url: "my_url",    // be sure to set this in your routes.rb
        data: myData,
        success: function(data) {          
            console.log("success. data:");
            console.log(data);
        }
    });
    

    아약스와 참고가 명시 적으로 지정하는 것이 좋습니다 있지만 jQuery를는 dataType와에 지능형 추측을 할 것입니다, 위의 코드.

    어느 쪽이든, 컨트롤러의 행동에, 당신은 JSON 개체를 얻을 수 있습니다 당신은 PARAMS 해시, 즉 함께 전달

    params[:shared_items]
    

    예를 들면 이 작업은 당신을 당신의 JSON 개체 다시 침을합니다 :

    def reply_in_json
      @shared = params[:shared_items]
    
      render :json => @shared
    end
    
  7. ==============================

    7.랙 JQuery와-PARAMS 보석 사용 (면책 조항 : 나는 저자 해요). 그것은 정수 키 해시되는 배열의 문제를 해결합니다.

    랙 JQuery와-PARAMS 보석 사용 (면책 조항 : 나는 저자 해요). 그것은 정수 키 해시되는 배열의 문제를 해결합니다.

  8. from https://stackoverflow.com/questions/6410810/rails-not-decoding-json-from-jquery-correctly-array-becoming-a-hash-with-intege by cc-by-sa and MIT license