Я пытаюсь передать, некоторые просачиваются мои параметрические усилители через форму как так:
hidden_field_tag "filters", params[:filters]
По некоторым причинам параметрические усилители изменяются в следующей странице. Например, если параметрические усилители [: фильтры] раньше были...
"filters"=>{"name_like_any"=>["apple"]} [1]
... это изменяется на...
"filters"=>"{\"name_like_any\"=>[\"apple\"]}" [2]
отметьте дополнительные цитаты и обратные косые черты в [2] по сравнению с [1].
Какие-либо идеи? Я пытаюсь использовать это с searchlogic для некоторой фильтрации, но мне нужен он для сохранения, когда я изменяю объекты изменения в формах. Я предпочел бы не должным быть хранить его на сессии.
Вы действительно хотите / должны "сериализовать" хеш с использованием скрытых полей.
Добавьте это в свой 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
это потому, что когда вы конвертируете в HTML с вашим hidden_field_tag, обратная цитата добавляется. После того, как вы получили его как строку, а не хэш.
Тип хеширования не может существовать в HTML. У вас есть только струна. Поэтому, если вы хотите передать свой хеш (я не рекомендую его), вам нужно оценить его, когда вы его получили. Но это может быть большой проблемой для безопасности вашего приложения.