我發現了一些代碼here,所以我再次發佈它你這樣很容易複製。
def underscore_key(k)
if defined? Rails
k.to_s.underscore.to_sym
else
to_snake_case(k.to_s).to_sym
end
end
def to_snake_case(string)
string.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
def convert_hash_keys(value)
case value
when Array
value.map { |v| convert_hash_keys(v) }
# or `value.map(&method(:convert_hash_keys))`
when Hash
Hash[value.map { |k, v| [underscore_key(k), convert_hash_keys(v)] }]
else
value
end
end
這裏有一些小測試,以證明功能:
p convert_hash_keys({abc:"x"}) # => {:abc=>"x"}
p convert_hash_keys({abcDef:"x"}) # => {:abc_def=>"x"}
p convert_hash_keys({AbcDef:"x"}) # => {:abc_def=>"x"}
p convert_hash_keys(["abc"]) # => ["abc"]
p convert_hash_keys([abc:"x"]) # => [{:abc=>"x"}]
p convert_hash_keys([abcDef:"x"]) # => [{:abc_def=>"x"}]
我希望能滿足您的要求。
當你建立一個API時,你必須規則 – apneadiving 2013-02-19 13:01:16
你會提供一個例子嗎?如果它是像userPermission這樣的類名,我們可以提供幫助。但實際上,這是一個嚴重的反模式。請注意,前端框架的餘燼將使用camelCase在JavaScript土地,但將其轉換爲Rails land中的camelCase。 – 2013-02-19 13:45:56
這不是關於班級名稱。這是關於JSON字段的名稱。我想讓Rails像現在一樣(帶有snake_case)和JS land(與camelCase一樣)。 – Hauleth 2013-02-19 15:15:33