こんにちは、現役沖縄フリーランスエンジニアのmah(MaLanka)です。
このブログでは、
僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、
ノウハウなどを書いていきます。
今回は、
- Ruby on Jetsで、Model.newに渡したパラメータが反映されず、valid?でfalseが返される時の対処法
についてです。
【Ruby on Jets】Model.newに渡したパラメータが反映されず、valid?でfalseが返される時の対処法
- 【Ruby on Jets】Model.newに渡したパラメータが反映されず、valid?でfalseが返される時の対処法
- 結論
- 起こったこと
- 初めての方はこちらのオススメ記事もどうぞ
- フリーランスエンジニアになりたい方はこちら
- Rubyを学習するならこちら
- フリーランスエンジニアのデメリットはこちら
結論
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が返される時の対処法
でした。
初めての方はこちらのオススメ記事もどうぞ
フリーランスエンジニアになりたい方はこちら
フォスターフリーランスという、
フリーランス専門エージェントを使うのがおすすめです。
自分もフォスターフリーランスを使って、
フリーランスエンジニアとしてのキャリアをスタートさせました。
フォスターフリーランスを使うと、
自分の代わりに、
プロの営業さんが案件を探してくれます。
最初の内は、
自分で営業なんてとても出来ないので、
非常にありがたかったです。
しかも無料で利用できる。
参考までに、
自分がお世話になっているエージェントを2つご紹介しておきます。
話を聞くだけでもOKなので、
ぜひ利用してみてください。
✅フォスターフリーランス【案件保有数5000件以上。業界25年の超老舗】
下記の記事で、
フォスターフリーランスの特徴について解説しています。
Rubyを学習するならこちら
Udemy という動画教材です。
なんとUdemy は、
60%OFFのセールをやっている時もあります。
こまめにチェックして、
スキルアップを図りましょう★
また、
Ruby関連の過去記事は下記にありますので、
合わせてチェックしてみてください◎
https://www.malanka.tech/archive/category/%E6%8A%80%E8%A1%93%E9%96%A2%E9%80%A3-Ruby
https://www.malanka.tech/archive/category/%E6%8A%80%E8%A1%93%E9%96%A2%E9%80%A3-Rubywww.malanka.tech
フリーランスエンジニアのデメリットはこちら
今回のコロナで、
参画していたプロジェクトが終了し、被害を受けました。
そこで、
コロナ被害を受けて感じている、
フリーランスエンジニアのデメリット【6つ】について、
noteを書きました。
下記に当てはまる人に、参考になると思います。
✅現在、フリーランスエンジニアとして生きている人
✅今からフリーランスエンジニアになろうとしている人
✅フリーランスエンジニアだが、コロナの影響で仕事が途絶えた人
https://note.com/malanka666/n/n081d40a196bfnote.com
今回、コロナの被害が直撃したことを受け、
— mah@フリーランスエンジニア (@RailsRubyMah6h) May 1, 2020
✅フリーランスエンジニアのデメリットを6つ
noteにしました。
スキルあろうが成果物だしてようが、
プロジェクトがストップしてしまうと、
どうしようもないです...https://t.co/tpdzxEaqBg#フリーランスエンジニア#駆け出しエンジニアと繋がりたい