Frage

Ich versuche, einige Filter in meiner params über ein Formular wie folgt:

hidden_field_tag "filters", params[:filters]

Für einige Grund Sie die Parameter geändert werden in der nächsten Seite.Zum Beispiel, wenn params[:Filter] verwendet werden...

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

...es wird geändert, um...

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

beachten Sie die zusätzlichen Angebote und Schrägstriche [2] im Vergleich zu [1].

Irgendwelche Ideen?Ich bin versucht, diese mit searchlogic für etwas filtern, aber ich brauche es zu erhalten, wenn ich ändern, ändern Sie Objekte in Formen.Ich würde lieber nicht haben, um es zu speichern in session.

War es hilfreich?

Lösung

Sie wollen tatsächlich / Notwendigkeit, 'serialize' Hash versteckte Felder verwendet wird.

Fügen Sie diese auf Ihre 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

Dann im Blick:

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

Das sollte es tun, auch wenn Sie in Ihrem Filter einen Multi-Level-Hash / Array haben.

Lösung genommen http://marklunds.com/articles/one/314

Andere Tipps

Meine Lösung war einfach neu erstellen jeweils param mit Schlüssel-Wert-Paar:

<% params[:filters].each do |key,value| %>
<%= hidden_field_tag "filters[#{key}]",value %> 
<% end %>

Hier ist, wie ich es geschafft, übergeben Sie einen parameter-Wert durch meiner Ansicht -, dass ist, aus der Sicht Eines durch die Anzeigen B und auf dem controller:

In Ansicht A (index):

<%= link_to 'LinkName', {:action => "run_script", :id => object.id} %>

In Ansicht B (run_script):

<%= form_tag :action => 'index', :id => @object %>
<%= hidden_field_tag(:param_name, params[:id]) %>

Im controller:

Just reference params[:param_name] to make use of the value.

Der key-übergang, der nicht dokumentiert ist und wo ich es finden konnte, ist, wo {...:id "= > "Objekt".id} von Anzeigen ist an Ansicht B <%...:id => @object %>, die Ansicht B geht dann auf den controller als (:param_name, params[:id]) durch die hidden_field_tag konstruieren.

Ich habe dies nicht dokumentiert sind irgendwo, aber nach durchlesen mehrere Beiträge über mehrere Websites, einschließlich dieser post (deren syntax vorausgesetzt, die wichtige inspiration), die Lösung, die schließlich geliert.Ich habe gesehen, die Hinweise auf versteckten Feldern in Bezug auf Sicherheit, aber haben keinen anderen Weg gefunden, dies zu tun, angesichts meiner aktuellen design, wie es ist.

es ist, weil, wenn Sie konvertieren in HTML mit Ihrem hidden_field_tag, die backquote hinzufügen.Nach, wenn Sie erhalten es wie ein string nicht in einen Hash.

Der Hash-Typ kann nicht vorhanden sein in HTML.Sie haben nur string.Also, wenn Sie wollen, übergeben Sie Ihre hash (nicht zu empfehlen von mir), Sie müssen Test es, wenn Sie es erhalten.Aber kann ein großes Sicherheitsproblem auf Ihre Bewerbung.

Als Vorbehalt zu Vlads Antwort musste ich verwenden raw :

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

, um es an die Arbeit in Rails 3.1.1. Im Wesentlichen wurde der Text ausgegeben werden entkam, z. B. "<" Werden "<".

scroll top