ブラウザから返ってくるenumの値はシンボルじゃなくて文字列だった

こんにちは!kossyです!




さて、今回はenumで定義した値をブラウザからパラメータとして受け取る場合、シンボルの形式ではなく文字列で
返ってくるのに気づかずハマったので、備忘録としてブログに残してみたいと思います。





enumのステータスによって処理を分岐させたいというシチュエーションでハマりました、、、

コードは例としてこんなんです。

  enum status: { draft: 1, published: 2 }

hogehoge_controller.rb

if params[:status] == :draft
~~
else
~~
end


ここでbinding.pryで処理を止めてparamsをみます。
(省略しまくってすみません。エスパーしてください笑)

コンソール

[1] pry(#<DraftsController>)> params                                                                                                                                     
=> <ActionController::Parameters {"utf8"=>"", "authenticity_token"=>"Rl3FrY+0vYyOoCFv2mRhKYs2Gc3ptfCfMAicrzwECs0YpW8ZHOTGWQ6hHVjepT3K1fADkCZ/7nYHmEp6YusqFQ==", "article"=><ActionController::Parameters {"title"=>"test", "description"=>"test", "body"=>"test", "category_id"=>"1", "status"=>"draft"} permitted: false>, "commit"=>"SAVE", "controller"=>"drafts", "action"=>"create"} permitted: false>

statusのハッシュの値が"draft"と文字列で来ています。
文字列とシンボルを比較すれば当たり前ですがfalseが返ります。これで悶々としてました。

解決策は、

if params[:status].to_sym == :draft

とすればtrueを返すことができます。

コンソールで試してみましょう。

[1] pry(main)> string = "string"                                                                                                                                         
=> "string"
[2] pry(main)> symbol = :string                                                                                                                                          
=> :string
[3] pry(main)> string == symbol                                                                                                                                          
=> false
[4] pry(main)> _string = string.to_sym                                                                                                                                   
=> :string
[5] pry(main)> _string == symbol                                                                                                                                         
=> true

こんな感じですね。


ブラウザから送られてくるenumのパラメーターは文字列型で返ると覚えましょう。(自戒を込めて)