在基于ActiveResource的插件中覆盖Array.to_param有什么后果

时间:2011-11-22 00:18:01

标签: ruby-on-rails ruby activeresource

基于active_resource的类:

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

会产生这个:

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

我正在使用的特定API需要:

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

所以,我发现:

ActiveResouce调用:

# Find every resource
find_every(options)

调用:

  # Builds the query string for the request.
  def query_string(options)
    "?#{options.to_query}" unless options.nil? || options.empty?
  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

到此:

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

它有效!!但是我不是特别高兴重新定义Array.to_param,因为这可能有无法预料的问题,特别是因为这个插件需要在rails中工作。

还有其他方法可以修补我的版本吗?

2 个答案:

答案 0 :(得分:2)

我肯定会建议不要修补像这样的数组方法猴子。如果您只有一个模型,是否可以覆盖搜索方法?

class Contact
  def self.search(options={})
    super(options).gsub('[]','')
  end
end

答案 1 :(得分:0)

由于此行为是我使用的API的标准,我能够将此补丁添加到我的ActiveRecord :: Base类。

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

感谢Beerlington指出我正确的方向。