Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 3878

Show
Ignore:
Timestamp:
03/15/06 21:46:41 (2 years ago)
Author:
minam
Message:

Underscore dasherized keys in formatted requests

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/CHANGELOG

    r3876 r3878  
    11*SVN* 
     2 
     3* Underscore dasherized keys in formatted requests [Jamis Buck] 
    24 
    35* Add MimeResponds::Responder#any for managing multiple types with identical responses [Jamis Buck] 
  • trunk/actionpack/lib/action_controller/cgi_ext/cgi_methods.rb

    r3874 r3878  
    7272      end 
    7373       
    74       params || {} 
     74      dasherize_keys(params || {}) 
    7575    rescue Object => e 
    7676      { "exception" => "#{e.message} (#{e.class})", "backtrace" => e.backtrace,  
     
    7979 
    8080  private 
     81 
     82    def self.dasherize_keys(params) 
     83       case params.class.to_s 
     84       when "Hash" 
     85         params.inject({}) do |h,(k,v)| 
     86           h[k.tr("-", "_")] = dasherize_keys(v) 
     87           h 
     88         end 
     89       else 
     90         params 
     91       end 
     92    end 
    8193 
    8294    # Splits the given key into several pieces. Example keys are 'name', 'person[name]', 
  • trunk/actionpack/lib/action_controller/mime_responds.rb

    r3876 r3878  
    3737        else 
    3838          if argument = args.first 
    39             eval("__mime_responder_arg__ = " + (argument.is_a?(String) ? "'" + argument + "'" : argument), @block_binding) 
     39            eval("__mime_responder_arg__ = #{argument.is_a?(String) ? argument.inspect : argument}", @block_binding) 
    4040            @responses[mime_type] = eval(DEFAULT_BLOCKS[(mime_type.to_sym.to_s + "_arg").to_sym], @block_binding) 
    4141          else 
  • trunk/actionpack/test/controller/webservice_test.rb

    r3847 r3878  
    2020 
    2121    def assign_parameters 
    22       render :text => (@params.keys - ['controller', 'action']).sort.join(", ") 
     22      if params[:full] 
     23        render :text => dump_params_keys 
     24      else 
     25        render :text => (params.keys - ['controller', 'action']).sort.join(", ") 
     26      end 
     27    end 
     28 
     29    def dump_params_keys(hash=params) 
     30      hash.keys.sort.inject("") do |s, k| 
     31        value = hash[k] 
     32        value = Hash === value ? "(#{dump_params_keys(value)})" : "" 
     33        s << ", " unless s.empty? 
     34        s << "#{k}#{value}" 
     35      end 
    2336    end 
    2437 
     
    89102    assert_equal false, @controller.request.xml_post?     
    90103  end 
     104 
     105  def test_dasherized_keys_as_xml 
     106    ActionController::Base.param_parsers[Mime::XML] = :xml_simple 
     107    process('POST', 'application/xml', "<first-key>\n<sub-key>...</sub-key>\n</first-key>", true) 
     108    assert_equal 'action, controller, first_key(sub_key), full', @controller.response.body 
     109  end 
     110 
     111  def test_dasherized_keys_as_yaml 
     112    ActionController::Base.param_parsers[Mime::YAML] = :yaml 
     113    process('POST', 'application/x-yaml', "---\nfirst-key:\n  sub-key: ...\n", true) 
     114    assert_equal 'action, controller, first_key(sub_key), full', @controller.response.body 
     115  end 
    91116   
    92117   
    93118  private   
    94119   
    95   def process(verb, content_type = 'application/x-www-form-urlencoded', data = ''
     120  def process(verb, content_type = 'application/x-www-form-urlencoded', data = '', full=false
    96121     
    97122    cgi = MockCGI.new({ 
    98123      'REQUEST_METHOD' => verb, 
    99124      'CONTENT_TYPE'   => content_type, 
    100       'QUERY_STRING'   => "action=assign_parameters&controller=webservicetest/test", 
     125      'QUERY_STRING'   => "action=assign_parameters&controller=webservicetest/test#{"&full=1" if full}", 
    101126      "REQUEST_URI"    => "/", 
    102127      "HTTP_HOST"      => 'testdomain.com',