Передача хеша как значения в hidden_field_tag

Я пытаюсь передать, некоторые просачиваются мои параметрические усилители через форму как так:

hidden_field_tag "filters", params[:filters]

По некоторым причинам параметрические усилители изменяются в следующей странице. Например, если параметрические усилители [: фильтры] раньше были...

"filters"=>{"name_like_any"=>["apple"]} [1]

... это изменяется на...

"filters"=>"{\"name_like_any\"=>[\"apple\"]}" [2]

отметьте дополнительные цитаты и обратные косые черты в [2] по сравнению с [1].

Какие-либо идеи? Я пытаюсь использовать это с searchlogic для некоторой фильтрации, но мне нужен он для сохранения, когда я изменяю объекты изменения в формах. Я предпочел бы не должным быть хранить его на сессии.

16
задан funkymunky 24 March 2010 в 07:07
поделиться

2 ответа

Вы действительно хотите / должны "сериализовать" хеш с использованием скрытых полей.

Добавьте это в свой ApplicationHelper :

  def flatten_hash(hash = params, ancestor_names = [])
    flat_hash = {}
    hash.each do |k, v|
      names = Array.new(ancestor_names)
      names << k
      if v.is_a?(Hash)
        flat_hash.merge!(flatten_hash(v, names))
      else
        key = flat_hash_key(names)
        key += "[]" if v.is_a?(Array)
        flat_hash[key] = v
      end
    end

    flat_hash
  end

  def flat_hash_key(names)
    names = Array.new(names)
    name = names.shift.to_s.dup 
    names.each do |n|
      name << "[#{n}]"
    end
    name
  end

  def hash_as_hidden_fields(hash = params)
    hidden_fields = []
    flatten_hash(hash).each do |name, value|
      value = [value] if !value.is_a?(Array)
      value.each do |v|
        hidden_fields << hidden_field_tag(name, v.to_s, :id => nil)          
      end
    end

    hidden_fields.join("\n")
  end

Затем, в поле зрения:

<%= hash_as_hidden_fields(:filter => params[:filter]) %>

Это должно сработать, даже если у вас есть многоуровневый хэш / массив в ваших фильтрах.

Решение принято http://marklunds.com/articles/one/314

12
ответ дан 30 November 2019 в 16:36
поделиться

это потому, что когда вы конвертируете в HTML с вашим hidden_field_tag, обратная цитата добавляется. После того, как вы получили его как строку, а не хэш.

Тип хеширования не может существовать в HTML. У вас есть только струна. Поэтому, если вы хотите передать свой хеш (я не рекомендую его), вам нужно оценить его, когда вы его получили. Но это может быть большой проблемой для безопасности вашего приложения.

0
ответ дан 30 November 2019 в 16:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: