This project is archived and is in readonly mode.
Nested with_options merge hash values
Reported by Lawrence Pit | June 26th, 2008 @ 01:07 AM
Consider this:
map.with_options :conditions => { :subdomain => /^www$/ } do |m|
m.with_options :conditions => { :method => :get } do |home|
home.main_home '/'
- etc.
end
- etc.
end
I expected that hitting http://foo.mydomain.com would not match home.main_home, but it does. This is because the with_options method overwrites the value for :conditions, losing the condition for subdomain.
Attached is a patch including tests that will merge hash values within options.
In the above example this would effectively result in:
map.main_home "/", :conditions => { :subdomain => /^www$/, :method => :get }
Comments and changes to this ticket
-
Lawrence Pit June 27th, 2008 @ 01:03 AM
- Tag changed from activesupport to activesupport, core_ext, patch, tests
Again, hopefully nicely formatted this time:
map.with_options :conditions => { :subdomain => /^www$/ } do |m| m.with_options :conditions => { :method => :get } do |home| home.root '/' end end
should equal:
map.root '/', :conditions => { :subdomain => /^www$/, :method => :get }
-
Pratik July 12th, 2008 @ 04:50 PM
- Assigned user set to Pratik
Hey Lawrence,
Looks nice. I wonder if we should rather add Hash#deep_merge method and simply use it here. Thoughts ?
-
Lawrence Pit July 14th, 2008 @ 03:01 AM
Attached version with deep_merge.
The code of deep_merge is a bit ugly though... You need to test for :to_hash for it to work with with_options, because OrderedHash is an Array, not a Hash. Nicer would of course be if you only needed to test for is_a?(Hash).
Secondly, calling is_a?(Hash) doesn't work within deep_merge. hash/conversions.rb shows the same issue, it comments:
- something weird with classes not matching here. maybe singleton methods breaking is_a?
hence the use of: val.class.to_s == 'Hash'.
-
Lawrence Pit July 14th, 2008 @ 03:17 AM
- no changes were found...
-
Lawrence Pit July 14th, 2008 @ 03:17 AM
just thinking, maybe we should add this method to OrderedHash? :
def is_a?(o) o == Hash end
Last patch implements this. Simplifies deep_merge.
-
Repository July 17th, 2008 @ 02:02 AM
- State changed from new to resolved
(from [40dbebba28bfa1c55737da7354542c3bdca4e1a1]) Allow deep merging of hash values for nested with_options. [#490 state:resolved]
Signed-off-by: Pratik Naik
-
Pratik July 17th, 2008 @ 02:20 AM
- State changed from resolved to new
Intentionally committed version without OrderedHash#is_a? as OrderedHash doesn't really behave like a hash ( lots of missing features like merge/update/etc. )
-
Pratik July 17th, 2008 @ 02:20 AM
- State changed from new to resolved
Create your profile
Help contribute to this project by taking a few moments to create your personal profile. Create your profile »
<h2 style="font-size: 14px">Tickets have moved to Github</h2>
The new ticket tracker is available at <a href="https://github.com/rails/rails/issues">https://github.com/rails/rails/issues</a>
People watching this ticket
Attachments
Tags
Referenced by
- 3392 rack.input requires ASCII-8BIT encoded StringIO https://rspec.lighthouseapp.com/projects/16211-cucumber/...