Sunday, October 19, 2008

URL options for polymorphic_url

routes.rb:
 map.resources :users 

というリソースへのルートを定義している場合、

 polymorphic_url(:users) # => "/users"

という具合になります。

そこで、追加のパラメータをあたえると
 polymorphic_url(:users, :foo => 1) # => "/users?foo=1"

となることを期待する訳なんですけど、 Rails 2.1.1 ではそうはならなくて、URLパラメータが付かない一つ前の例と同じパスが返ってくる。

#880 URL options for polymorphic_url - Ruby on Rails - rails

edge では修正されてますけど、リリースするまでは、以下のような汚いパッチでごまかします。

if Rails::VERSION::STRING == "2.1.1"
# polymorphic_url should accept extra parameter options
# polymorphic_path(:projects, :foo => 1) # should be => /projects?foo=1
# This portion of code fixes this issue in a quick and dirty way.
ActionController::PolymorphicRoutes.module_eval do
def polymorphic_url_with_params(record_or_hash_or_array, options = {})
url = polymorphic_url_without_params(record_or_hash_or_array, options)
url_options = options.except(:action, :routing_type, :format)
unless url_options.blank?
url += "?" + url_options.to_param
end
url
end
alias_method_chain :polymorphic_url, :params

%w(edit new formatted).each do |action|
module_eval <<-EOT, __FILE__, __LINE__
def #{action}_polymorphic_url(record_or_hash, options = {})
polymorphic_url(record_or_hash, options.merge(:action => "#{action}"))
end

def #{action}_polymorphic_path(record_or_hash, options = {})
polymorphic_url(record_or_hash, options.merge(:action => "#{action}", :routing_type => :path))
end
EOT
end
end
end

No comments: