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

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

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

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


転職を絶対成功させたい、駆け出しエンジニアの方へ


このブログからよく購入されている、

駆け出しエンジニアのマインドセットができるnote2点です↓↓↓


note.com


note.com





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


このブログでは、

僕が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




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


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

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


f:id:mah666hhh:20200615083445p:plain


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

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


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

自分の代わりに、

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


最初の内は、

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

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


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


参考までに、

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


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

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


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

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


下記の記事で、

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


www.malanka.tech




Rubyを学習するならこちら


Udemy という動画教材です。


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




なんとUdemy は、

60%OFFのセールをやっている時もあります。


こまめにチェックして、

スキルアップを図りましょう★




また、

Ruby関連の過去記事は下記にありますので、

合わせてチェックしてみてください◎


Ruby カテゴリーの記事一覧 - スリ飯屋Malankaのフリーエンジニアな日々

www.malanka.tech




フリーランスエンジニアのデメリットはこちら


今回のコロナで、

参画していたプロジェクトが終了し、被害を受けました。


そこで、

コロナ被害を受けて感じている、

フリーランスエンジニアのデメリット【6つ】について、

noteを書きました。


下記に当てはまる人に、参考になると思います。

現在、フリーランスエンジニアとして生きている人

今からフリーランスエンジニアになろうとしている人

フリーランスエンジニアだが、コロナの影響で仕事が途絶えた人


note.com





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


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