Changeset 1670
- Timestamp:
- 02/29/08 08:42:56 (3 months ago)
- Files:
-
- trunk/app/models/article.rb (modified) (1 diff)
- trunk/app/models/feedback.rb (modified) (1 diff)
- trunk/app/models/url_policy.rb (modified) (2 diffs)
- trunk/spec/models/url_policy_spec.rb (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/app/models/article.rb
r1666 r1670 107 107 end 108 108 109 def to_params(builder = :no_argument)110 (builder == :no_argument ? builder : UrlPolicy.instance).article_params(self)111 end112 113 109 def trackback_url 114 110 blog.url_for(permalink_url_options(true).merge(:controller => 'trackbacks', :action => 'index')) trunk/app/models/feedback.rb
r1669 r1670 26 26 end 27 27 28 def to_param s(builder)29 builder.feedback_params(self)28 def to_param 29 guid 30 30 end 31 31 32 def to_param33 guid32 def parent 33 article 34 34 end 35 35 trunk/app/models/url_policy.rb
r1669 r1670 1 1 require 'singleton' 2 3 # Helper method for hash 4 class Hash 5 def prefix_keys(prefix) 6 inject({}) {|o, (k,v)| 7 returning(o) do 8 if k.respond_to?(:to_str) || k.instance_of?(Symbol) 9 o["#{prefix}_#{k}".to_sym] = v 10 else 11 o[k] = v 12 end 13 end 14 } 15 end 16 17 def coalesce_params 18 inject({}) { |o, (k, v)| 19 returning(o) do 20 if v.instance_of?(Hash) 21 o.merge!(v.prefix_keys(k.to_s.singularize)) 22 else 23 o[k] = v 24 end 25 end 26 } 27 end 28 end 29 2 30 class UrlPolicy 3 31 include ::Singleton … … 32 60 def url_for_object(object, opts = {}) 33 61 with_options(opts) { |o| 34 o.url_for( object.to_params(self))62 o.url_for(params_for(object)); 35 63 } 64 end 65 66 def params_for(object) 67 resource_params(object).coalesce_params.reverse_merge(default_controller_and_action_for(object)) 68 end 69 70 def coalesce_params(params_hash) 71 params_hash.coalesce_params 72 end 73 74 def default_controller_and_action_for(object) 75 { :controller => object.class.name.pluralize.underscore, 76 :action => object.new_record? ? :new : :show } 36 77 end 37 78 38 79 def edit_url_for(object, opts = {}) 39 80 with_options(opts) { |o| 40 url_for( object.to_params(self).merge(:action => object.new_record? ? :new : :edit))81 url_for(params_for(object).merge(:action => object.new_record? ? :new : :edit)) 41 82 } 42 83 end 43 84 44 def article_params(article) 45 returning(:controller => 'articles') do |params| 46 if article.new_record? 47 params.merge!(:action => :new) 48 else 49 date = article.published_at 50 params.merge!(:action => :show, 51 :year => date.year, 52 :month => '%02i' % date.month, 53 :day => '%02i' % date.day, 54 :id => article.permalink) 85 def characteristic_hash(resource) 86 raise ArgumentErrror, "#{resource}.new_record? must not be true" if resource.new_record? 87 88 class_specific_method_name = "characteristic_#{resource.class.name.underscore}_hash" 89 if self.respond_to?(class_specific_method_name) 90 self.send(class_specific_method_name, resource) 91 else 92 return { :id => resource.to_param } 93 end 94 end 95 96 def characteristic_article_hash(article) 97 date = article.published_at 98 return { :year => date.year, 99 :month => '%02i' % date.month, 100 :day => '%02i' % date.day, 101 :id => article.permalink } 102 end 103 104 def resource_params(resource) 105 returning(ancestors_hash(resource)) do |params| 106 unless resource.new_record? 107 params.merge! characteristic_hash(resource) 55 108 end 56 109 end 57 110 end 58 111 59 def feedback_params(feedback) 60 returning(:controller => feedback.class.name.pluralize.underscore, :action => 'show') do |params| 61 article_params(feedback.article).each do |k,v| 62 next if k == :controller || k == :action 63 params["article_#{k}".to_sym] = v 112 alias_method :article_params, :resource_params 113 alias_method :feedback_params, :resource_params 114 115 def ancestors_hash(resource, collector = {}) 116 returning(collector) do |ret| 117 if resource.respond_to?(:parent) 118 collector[resource.parent.class.name.downcase.underscore] = 119 characteristic_hash(resource.parent) 120 ancestors_hash(resource.parent, collector) 64 121 end 65 params[:id] = feedback.to_param66 122 end 67 123 end trunk/spec/models/url_policy_spec.rb
r1669 r1670 21 21 end 22 22 23 it "#url_for(<trackback on article 3>).should == /articles/2004/06/01/article-3/comments/#\{trackback.guid}" do 24 article = contents(:article3) 25 trackback = article.trackbacks.build(:title => 'Foo', :excerpt => 'bar', :url => 'http://empty.cabi.net/') 26 trackback.save(false) 27 UrlPolicy.instance.url_for(trackback).should == 28 "/articles/2004/06/01/article-3/trackbacks/#{trackback.guid}" 23 describe "(for a trackback)" do 24 before(:each) do 25 @article = contents(:article3) 26 @trackback = @article.trackbacks.build(:title => 'Foo', :excerpt => 'bar', 27 :url => 'http://empty.cabi.net/') 28 end 29 30 it "#url_for(<trackback on article 3>).should == /articles/2004/06/01/article-3/comments/#\{trackback.guid}" do 31 @trackback.save(false) 32 UrlPolicy.instance.url_for(@trackback).should == 33 "/articles/2004/06/01/article-3/trackbacks/#{@trackback.guid}" 34 end 29 35 end 30 36
