Rails params如何解析字符串中的哈希值

时间:2015-08-26 04:04:07

标签: ruby-on-rails ruby params

我正在学习Ruby on Rails并且很好奇params方法是如何工作的。我明白它的作用,但是怎么做?

是否有内置方法采用类似哈希的字符串

"cat[name]"

并将其翻译为

{ :cat => { :name => <assigned_value> } } 

我自己尝试编写了params方法,但我不确定如何在ruby中编写这个功能。

2 个答案:

答案 0 :(得分:1)

GET参数是从$(Q)$(CC) $(SOFLAGS) -o $@ $(MINIZIP_DIR)/ioapi.so \ -Wl,-rpath=$(ZLIBDIR) $(MINIZIP_DIR)/zip.so ... 设置的,ActionDispatch::Request#GET扩展Rack::Request#GET,使用Rack::QueryParser#parse_nested_query

POST参数是从ActionDispatch::Request#POST设置的,Rack::Request#POST扩展textfield.blur(); ,使用Rack::Multipart#parse_multipart。这会在lib/rack/multipart中显示更多文件。

答案 1 :(得分:0)

这是方法功能的再现(注意:这不是方法的工作原理)。感兴趣的助手方法:#array_to_hash#handle_nested_hash_array

require 'uri'

class Params
  def initialize(req, route_params = {})
    @params = {}

    route_params.keys.each do |key|
      handle_nested_hash_array([{key => route_params[key]}])
    end

    parse_www_encoded_form(req.query_string) if req.query_string
    parse_www_encoded_form(req.body) if req.body
  end

  def [](key)
    @params[key.to_sym] || @params[key.to_s]
  end

  def to_s
    @params.to_s
  end

  class AttributeNotFoundError < ArgumentError; end;

  private

  def parse_www_encoded_form(www_encoded_form)
    params_array = URI::decode_www_form(www_encoded_form).map do |k, v|
      [parse_key(k), v]
    end

    params_array.map! do |sub_array|
      array_to_hash(sub_array.flatten)
    end

    handle_nested_hash_array(params_array)
  end

  def handle_nested_hash_array(params_array)
    params_array.each do |working_hash|
      params = @params

      while true
        if params.keys.include?(working_hash.keys[0])
          params = params[working_hash.keys[0]]
          working_hash = working_hash[working_hash.keys[0]]
        else
          break
        end

        break if !working_hash.values[0].is_a?(Hash)
        break if !params.values[0].is_a?(Hash)
      end

      params.merge!(working_hash)
    end
  end

  def array_to_hash(params_array)
    return params_array.join if params_array.length == 1

    hash = {}
    hash[params_array[0]] = array_to_hash(params_array.drop(1))

    hash
  end

  def parse_key(key)
    key.split(/\]\[|\[|\]/)
  end
end