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

このブログでは、フリーランス5期目となる自身の実体験から、フリーランスエンジニアになるためのノウハウ、ブログや沖縄移住、スリランカの最新情報について発信します。

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

※記事内に提携先企業のアフィリエイト広告(リンク、バナー等)、Google広告を含む場合があります


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


こんにちは、現役沖縄フリーランスエンジニアのmah(MaLanka)です。


このブログでは、

僕がIT未経験から約1年でフリーランスエンジニアになるまでの過程、

ノウハウなどを書いていきます。


今回は、

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

についてです。


【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が返される時の対処法

でした。




初めての方はこちらのオススメ記事もどうぞ


note.com


www.malanka.tech


www.malanka.tech


www.malanka.tech


www.malanka.tech




フリーランスエンジニアになりたい方はこちら


フォスターフリーランスという、

フリーランス専門エージェントを使うのがおすすめです。



自分もフォスターフリーランスを使って、

フリーランスエンジニアとしてのキャリアをスタートさせました。


フォスターフリーランスを使うと、

自分の代わりに、

プロの営業さんが案件を探してくれます。


最初の内は、

自分で営業なんてとても出来ないので、

非常にありがたかったです。


しかも無料で利用できる。


参考までに、

自分がお世話になっているエージェントを2つご紹介しておきます。


話を聞くだけでもOKなので、

ぜひ利用してみてください。


フォスターフリーランス【案件保有数5000件以上。業界25年の超老舗】

無料でフォスターフリーランスに登録


下記の記事で、

フォスターフリーランスの特徴について解説しています。


www.malanka.tech




Rubyを学習するならこちら


Udemy という動画教材です。


はじめてのRuby on Rails入門-RubyとRailsを基礎から学びWebアプリケーションをネットに公開しよう




なんと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