Rails неправильно декодирует массив хэшей из jQuery

На мой взгляд, я сохраняю массив хэшей в скрытом поле.

    <div>
       <%= hidden_field_tag :data_filtered, :value => @data_filtered %>
    </div>

Мой javascript

$(document).ready(function(){
    freezeTopRow($('#dataTable'));
    $("#export").click(function(){
        var data1 = $("#data_filtered").val()
        $.ajax({
            type: "POST",
            url: "export",
            dataType: 'json',
            data: {data_filtered: data1}
        });
    });
});

Мой контроллер

  def export
    CSV.open("data.csv", "wb") do |csv|
       csv << params[:data_filtered].first.keys
       @data_filtered.each do |hash|
       csv << hash.values
      end
    end
  end

Когда я просматриваю params[:data_filtered] после того, как он был возвращен контроллеру, я вижу строку:

 "{:value=>[{"a"=>nil, "b"=>nil, "c"=>0}]}"

Но я хочу, чтобы он был в исходной форме (массив хэшей, в данном случае всего 1 хеш), половина проблемы — это :value. Я не хочу, чтобы это сохранялось, и я не знаю, как это проанализировать, чтобы получить только массив. В основном я хочу

[{"a"=>nil, "b"=>nil, "c"=>0]

person Community    schedule 01.07.2013    source источник
comment
Что такое @data_filtered на ваш взгляд? Может быть, это хэш?   -  person mu is too short    schedule 01.07.2013
comment
@data_filtered — это массив хэшей   -  person    schedule 01.07.2013
comment
Рассматривали ли вы сериализацию вручную в известном формате, чтобы вы могли легко распаковать его? Вы получаете результат вызова to_s, который не предназначен для простого анализа. Если вы используете JSON, синтаксический анализ становится проще.   -  person mu is too short    schedule 01.07.2013


Ответы (1)


Попробуйте отправить данные json вместо строки (содержащей хэш). Если вы отправляете строку через ajax, то в контроллере вам нужно eval параметры, которые имеют СЕРЬЕЗНУЮ проблему БЕЗОПАСНОСТИ.

используя eval: (ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ ЭТО)

eval('{:value=>[{"a"=>nil, "b"=>nil, "c"=>0}]}') will produce the original hash: {:value=>[{"a"=>nil, "b"=>nil, "c"=>0}]}
person Muntasim    schedule 01.07.2013
comment
как отправить данные json вместо строки? - person ; 01.07.2013
comment
stackoverflow .com/questions/6762735/ - person Muntasim; 01.07.2013
comment
чем это отличается от того, что я делаю? - person ; 01.07.2013
comment
вы можете найти разницу, если проверите параметр. В текущей реализации params[:data_filtered] — это просто строка, но если вы отправляете такие данные, как: data: {data_filtered: {value: [...]}}, вы можете получить фактические параметры, используя params[:data_filtered][:value] в своем контроллере. - person Muntasim; 01.07.2013
comment
проблема все та же. теперь params[:data_filtered][:value] = {:value=›[{a=›nil, b=›nil, c=›0}]} но я хочу просто [{a=›nil, b=›nil , с=›0}] - person ; 01.07.2013
comment
Пожалуйста, не используйте eval, если вы беспокоитесь о безопасности. - person Bruno Peres; 13.05.2016