Welche Konsequenzen hat das Überschreiben von Array.to_param in einem ActiveResource-basierten Plugin?

  • Eine auf Active_resource basierende Klasse:

     Contact.search(:email => ['bar@foo.com','foo@bar.com'])
     

    würde Folgendes erzeugen:

     ?email[]=bar@foo.com&email[]=foo@bar.com
     

    Die spezifische API, mit der ich arbeite, erfordert Folgendes:

     ?email=bar@foo.com&email=foo@bar.com
     

    Ich habe also beim Herumspielen gefunden:

    ActiveResouce-Aufrufe:

     # Find every resource
    find_every(options)
     

    die aufruft:

       # Builds the query string for the request.
      def query_string(options)
        "?#{options.to_query}" unless options.nil? || options.empty?
      end
     

    Wenn ich also aktualisiere:

     class Array
      # Converts an array into a string suitable for use as a URL query string,
      # using the given +key+ as the param name.
      #
      # ['Rails', 'coding'].to_query('hobbies') # => "hobbies%5B%5D=Rails&hobbies%5B%5D=coding"
      def to_query(key)
        prefix = "#{key}[]"
        collect { |value| value.to_query(prefix) }.join '&'
      end
    end
     

    :

     class Array
      # Converts an array into a string suitable for use as a URL query string,
      # using the given +key+ as the param name.
      #
      # ['Rails', 'coding'].to_query('hobbies') # => "hobbies%5B%5D=Rails&hobbies%5B%5D=coding"
      def to_query(key)
        prefix = "#{key}"
        collect { |value| value.to_query(prefix) }.join '&'
      end
    end
     

    es funktioniert !! Ich bin jedoch nicht besonders glücklich, Array.to_param neu zu definieren, da dies unvorhergesehene Probleme haben kann, zumal dieses Plug-In innerhalb von Gleisen arbeiten muss meine Version?

    22 November 2011
    ktec
2 answers
  • Ich würde definitiv empfehlen, NICHT eine solche Array-Methode zu patchen. Wenn Sie nur ein einzelnes Modell haben, können Sie die Suchmethode überschreiben?

     class Contact
      def self.search(options={})
        super(options).gsub('[]','')
      end
    end
     
    22 November 2011
    Peter Brown
  • Da dieses Verhalten durch die API, die ich verwende, Standard ist, konnte ich diesen Patch meiner ActiveRecord :: Base-Klasse hinzufügen.

       def query_string(options)
        begin
          super(options).gsub('%5B%5D','')
        rescue
        end
      end
     

    Danke an Beerlington, dass Sie mich dafür in die richtige Richtung gerichtet haben.

    22 November 2011
    ktec