こんにちは!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のパラメーターは文字列型で返ると覚えましょう。(自戒を込めて)