Changeset 1670

Show
Ignore:
Timestamp:
02/29/08 08:42:56 (3 months ago)
Author:
pdcawley
Message:

UrlPolicy? refactoring

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/app/models/article.rb

    r1666 r1670  
    107107  end 
    108108 
    109   def to_params(builder = :no_argument) 
    110     (builder == :no_argument ? builder : UrlPolicy.instance).article_params(self) 
    111   end 
    112  
    113109  def trackback_url 
    114110    blog.url_for(permalink_url_options(true).merge(:controller => 'trackbacks', :action => 'index')) 
  • trunk/app/models/feedback.rb

    r1669 r1670  
    2626  end 
    2727 
    28   def to_params(builder) 
    29     builder.feedback_params(self) 
     28  def to_param 
     29    guid 
    3030  end 
    3131 
    32   def to_param 
    33     guid 
     32  def parent 
     33    article 
    3434  end 
    3535 
  • trunk/app/models/url_policy.rb

    r1669 r1670  
    11require 'singleton' 
     2 
     3# Helper method for hash 
     4class 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 
     28end 
     29 
    230class UrlPolicy 
    331  include ::Singleton 
     
    3260  def url_for_object(object, opts = {}) 
    3361    with_options(opts) { |o| 
    34       o.url_for(object.to_params(self)) 
     62      o.url_for(params_for(object)); 
    3563    } 
     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 } 
    3677  end 
    3778 
    3879  def edit_url_for(object, opts = {}) 
    3980    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)) 
    4182    } 
    4283  end 
    4384 
    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) 
    55108      end 
    56109    end 
    57110  end 
    58111 
    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) 
    64121      end 
    65       params[:id] = feedback.to_param 
    66122    end 
    67123  end 
  • trunk/spec/models/url_policy_spec.rb

    r1669 r1670  
    2121  end 
    2222 
    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 
    2935  end 
    3036