ruby-on-rails – 将所有控制器参数从camelCase转换为Rails中的snake_case是最好的方法?

如您所知,JSON命名惯例主张使用camelSpace,而Rails主张使用snake_case作参数名称.

在rails控制器中将所有请求的参数转换为snake_case的最佳方式是什么?

由此:

{
  ...
  "firstName": "John","lastName": "Smith","moreInfo":
  {
    "mealType": 2,"mealSize": 4,...
  }
}

到这个:

{
  ...
  "first_name": "John","last_name": "Smith","more_info":
  {
    "meal_type": 2,"meal_size": 4,...
  }
}

谢谢

解决方法

完成以下步骤后,通过JSON请求提交的camelCase参数名称将更改为snake_case.

例如,一个名为passwordConfirmation的JSON请求参数将在控制器中作为params [:password_confirmation]

在config / initializers / json_param_key_transform.rb创建一个初始化器.此文件将仅更改JSON请求的参数解析行为(JSON请求必须具有请求标头Content-Type:application / json).

找到您的Rails版本并选择下面相应的部分(在Gemfile.lock中找到您的Rails版本):

仅适用于Rails 5

对于Rails 5,将骆驼案例的param键转换为snake-case,将其放在初始化器中:

# File: config/initializers/json_param_key_transform.rb
# Transform JSON request param keys from JSON-conventional camelCase to
# Rails-conventional snake_case:
ActionDispatch::Request.parameter_parsers[:json] = -> (raw_post) {
  # Modified from action_dispatch/http/parameters.rb
  data = ActiveSupport::JSON.decode(raw_post)
  data = {:_json => data} unless data.is_a?(Hash)

  # Transform camelCase param keys to snake_case:
  data.deep_transform_keys!(&:underscore)
}

对于Rails 4.2(也许更早版本)

对于Rails 4.2(也许更早的版本),要将camel-case参数键转换为snake-case,请将其放在初始化程序中:

# File: config/initializers/json_param_key_transform.rb
# Transform JSON request param keys from JSON-conventional camelCase to
# Rails-conventional snake_case:
Rails.application.config.middleware.swap(
  ::ActionDispatch::ParamsParser,::ActionDispatch::ParamsParser,::Mime::JSON => Proc.new { |raw_post|

    # Borrowed from action_dispatch/middleware/params_parser.rb except for
    # data.deep_transform_keys!(&:underscore) :
    data = ::ActiveSupport::JSON.decode(raw_post)
    data = {:_json => data} unless data.is_a?(::Hash)
    data = ::ActionDispatch::Request::Utils.deep_munge(data)

    # Transform camelCase param keys to snake_case:
    data.deep_transform_keys!(&:underscore)

    data.with_indifferent_access
  }
)

所有Rails版本的最后一步

重新启动rails服务器.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...