スリ飯屋Malankaのフリーエンジニアな日々

IT実務未経験から約1年、東京でフリーランスのRuby on Railsエンジニアに転職。約2年半、大阪中崎町でスリランカカレーの間借りしてました。フリーランスエンジニアになるためのノウハウ、スリランカの事を発信していきます。

【Ruby on Jets】Model.newに渡したパラメータが反映されず、valid?でfalseが返される時の対処法

【Ruby on Jets】Model.newに渡したパラメータが反映されず、valid?でfalseが返される時の対処法


こんにちは、mah(@RailsRubyMah6h)です。


このブログでは、僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、ノウハウなどを書いていきます。


今回は、

  • Ruby on Jetsで、Model.newに渡したパラメータが反映されず、valid?でfalseが返される時の対処法

についてです。


結論


newに渡すキーを、

文字列のキーにすると動きました。

(シンボルのキーじゃダメ!!!)


起こったこと


Ruby on Jetsでバリデーションをかけていました。


下記のArticleモデルには、

各属性に、必須であること

のバリデーションを設定しています。

# app/models/article.rb

require 'active_model'

class Article < Dynomite::Item
  # How to use dynomite
  # https://github.com/tongueroo/dynomite

  include ActiveModel::Validations

  column :id, :title, :published_at, :link

  validates_presence_of :title, :published_at, :link
end


バリデーションが機能するかをコンソールで検証します。

$ be jets c
Jets booting up in development mode!

# パラメータを渡してnew
irb(main):001:0> a = Article.new(id: '123', title: 'テスト', link: 'http://example.com', published_at: '2020-03-29')
=> #<Article:0x00007fc2bd6802b8 @attrs={:id=>"123", :title=>"テスト", :link=>"http://example.com", :published_at=>"2020-03-29"}>

# 何故かfalseが返る
irb(main):002:0> a.valid?
=> false

# パラメータを渡しているが、何故かblank扱いされている
irb(main):003:0> a.errors
=> #<ActiveModel::Errors:0x00007fc2bd691018 @base=#<Article:0x00007fc2bd6802b8 @attrs={:id=>"123", :title=>"テスト", :link=>"http://example.com", :published_at=>"2020-03-29"}, @validation_context=nil, @errors=#<ActiveModel::Errors:0x00007fc2bd691018 ...>>, @messages={:title=>["can't be blank"], :published_at=>["can't be blank"], :link=>["can't be blank"]}, @details={:title=>[{:error=>:blank}], :published_at=>[{:error=>:blank}], :link=>[{:error=>:blank}]}>


ここで謎現象。


newで作成したインスタンスには、

各パラメータを渡しているのに、valid?でfalseが返る。


意味がわかりません笑


aの中身まで辿っていっても、

ちゃんと値は返ってくる。

irb(main):004:0> a.attrs
=> {"id"=>"123", "title"=>"テスト", "link"=>"http://example.com", "published_at"=>"2020-03-29"}

irb(main):005:0> a.attrs['id']
=> "123"


なぜ???笑


原因


attrsの戻り値を見て「...まさか」と思ったのが、

attrsの戻り値のキーが、

文字列のキー だということ。

# キーが文字列

irb(main):004:0> a.attrs
=> {"id"=>"123", "title"=>"テスト", "link"=>"http://example.com", "published_at"=>"2020-03-29"}


自分はシンボルのキーを使ってnewした。

# キーがシンボル
irb(main):001:0> a = Article.new(id: '123', title: 'テスト', link: 'http://example.com', published_at: '2020-03-29')
=> #<Article:0x00007fc2bd6802b8 @attrs={:id=>"123", :title=>"テスト", :link=>"http://example.com", :published_at=>"2020-03-29"}>


...たまーにある、

すごく嫌いなパターンなのですが、

文字列のキーでnewしてみます...


検証

# newの引数のキーを、文字列のキーに変更
irb(main):009:0> a = Article.new("id" => '123', "title" => 'テスト', "link" => 'http://example.com', "published_at" => '2020-03-29')
=> #<Article:0x00007fc2be32d218 @attrs={"id"=>"123", "title"=>"テスト", "link"=>"http://example.com", "published_at"=>"2020-03-29"}>

# trueが返ってきた...
irb(main):010:0> a.valid?
=> true

# DB保存もOK!
irb(main):011:0> a.replace
=> #<Article:0x00007fc2be32d218 @attrs={"id"=>"123", "title"=>"テスト", "link"=>"http://example.com", "published_at"=>"2020-03-29", "created_at"=>"2020-03-29T11:40:35Z", "updated_at"=>"2020-03-29T11:40:35Z"}, @validation_context=nil, @errors=#<ActiveModel::Errors:0x00007fc2c25b56a8 @base=#<Article:0x00007fc2be32d218 ...>, @messages={}, @details={}>>

# エラー無し!
irb(main):012:0> a.errors
=> #<ActiveModel::Errors:0x00007fc2c25b56a8 @base=#<Article:0x00007fc2be32d218 @attrs={"id"=>"123", "title"=>"テスト", "link"=>"http://example.com", "published_at"=>"2020-03-29", "created_at"=>"2020-03-29T11:40:35Z", "updated_at"=>"2020-03-29T11:40:35Z"}, @validation_context=nil, @errors=#<ActiveModel::Errors:0x00007fc2c25b56a8 ...>>, @messages={}, @details={}>


予想通り、文字列のキーだと動きました笑

今回の原因は シンボルのキー。


Rubyやってる人なら、

一度はこの問題当たったことあるんじゃないでしょうか?

うっとおしいですよねこれ...笑


統一して欲しい笑




以上、

  • Ruby on Jetsで、Model.newに渡したパラメータが反映されず、valid?でfalseが返される時の対処法

でした。



このブログでは、僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、ノウハウなどを書いています。

  • フリーランスに興味がある

  • 今まさに活動している

という方は、下記の記事で、

  • 【実体験】高卒文系が1年でRailsのフリーエンジニアになった話

  • 【週3案件豊富 正社員並の保証】フリーランスエージェント**Midworks**を使ってみた感想

  • 【10倍効率化!?】プログラマの作業が鬼捗る【8つのグッズ】

を紹介していますので、よかったらチェックしてみてください。

www.malanka.tech

www.malanka.tech

www.malanka.tech






また、

駆け出しエンジニアに向けてのnoteを3月17日にリリースしました。

note.com

活躍出来るエンジニアになるためのマインドを、

ギュッと詰め込んだ、「実践型note」になってます。

  • 「IT転職を成功させたい!」

という方は是非チェックしてみてください。






最後までお読み頂きありがとうございました★

もしよかったらTwiiterのフォローもお願いします★