今天,想分享给大家一个关于Rails中Hash类的一个拓展方法 Hash#with_indifferent_access

具体示例代码如下:

rgb = { black: '#000000', white: '#FFFFFF' }.with_indifferent_access
rgb[:black] => '#000000'
rgb['block'] => '#000000'

接下来,我们谈谈使用场景,在rspec中我们会写一些测试给对应的action, 去检测返回的json值是否正确.

> xxx_controller.rb

...
def panel_info
  render { width: 100, height: 200 }
end
...

> xxx_controller_spec.rb

...
it 'xxxx' do
  get :panel_info, format: :json
  response_body = JSON.parse(response.body)

  expect(response_body['width']).to eq(100)
end
...

从上面的例子我们可以看到,此时我们必须使用string key ('width') 在response_body中取值。如果,您和我一样已经写习惯了使用sym的写法 -> response_body[:width] 感觉这样看这更舒服些的话。

那你就可以使用 hash#with_indifferent_access 来帮我们实现这个简单的改变

response_body = JSON.parse(response.body).with_indifferent_access
expect(response_body['width']).to eq(100)
expect(response_body[:width]).to eq(100)

此时,我们可以便可以使用 sym [:width]  的方式来轻松取值. 

相关连接  -  https://api.rubyonrails.org/v5.2/classes/ActiveSupport/HashWithIndifferentAccess.html