U_OK_2023’s blog

主に日々のプログラミング学習についてのアウトプットと備忘録

【保存】mergeメソッド【違うテーブルの情報を含める】

皆様、こんにちわ。
U_OK_2023 です。

本日も、夕方からWEB面接がありました。
結果は後日とのことです。

本日もオリジナルアプリの作成をしました。
前回、フォームに情報を入力できるところまでをしたので、
本日は、その入力した情報をテーブルに保存するところまでを実装しました。

まず、フォームで入力した情報をテーブルに保存するためには、
MVCの流れを意識します。

1️⃣ルーティングでcreateアクション設定する。
2️⃣コントローラーにcreateアクションを定義し、
 保存するために入力した情報を
 paramusで許可をする処理を記述する。
3️⃣情報を入力するビューのform_with に @モデル、url を設定する。

1️⃣ルーティングでcreateアクション設定する。

config/routes.rb

  resources :tasks, only: [:new, :create]

create は 保存するという意味ですね。
後ほどビューのフォームにパスを設定する必要があるため追加します。

2️⃣コントローラーにcreateアクションを定義し、
 保存するために入力した情報を
 paramusで許可をする処理を記述する。

app/controllers/tasks_controller.rb

  def create
    Task.create(task_params)
    redirect_to root_path
  end
  
  private

  def task_params
    params.require(:task).permit(:task_name, :description, :category_id, :deadline).merge(user_id: current_user.id)
  end

createアクションが実行される際、task_params を呼び出し、
ストロングパラメーターを使用し、保存する値を許可する。
その際、user_id は 「誰の」タスクなのかを紐付けるために、
usersテーブルとアソシーションを組んでいるため、取得できる値です。

上記コードの
:task_name, :description, :category_id, :deadline は tasksテーブルの情報です。
user_id は usersテーブルの情報です。

今回取得した tasksテーブルの user_id の 10 は

https://i.gyazo.com/087fd5a28a3528d2d87e60697b64d63e.png

usersテーブル の id の 10 のことです。

このように違うテーブルの情報を含めるためには mergeメソッドを使い
tasksテーブル と usersテーブル の情報を
merge(結合)することで情報を取得することができます。
merge(user_id: current_user.id) の意味は、
「user_idカラムに 現在ログインしているユーザー
(情報をフォームに入力したユーザー)の id の情報を tasksテーブルに結合する」
という意味になります。

3️⃣情報を入力するビューのform_with に @モデル、url を設定する。

最後にビューの設定です。
情報を送るために、form_with を使用します。

app/views/tasks/new.html.erb

<%= form_with model: @task, url: tasks_path, class: '***-main', local: true do |f| %>

model:@task の @task は コントローラーで newアクションを定義した際に生成した
@インスタンス変数 のことです。

  def new
    @task = Task.new
  end

url: tasks_path は ルーティングで create を 追加した際に生成されたパスです
ターミナルで rails routes コマンドでパスを確認できます。

https://i.gyazo.com/04f316817607ba7b2cec434281ebf483.png

実装後、フォームに情報を入力し、保存ボタンをクリックし、
情報が保存されたことを確認できました。

 

 

 

 

【日付】f.date_field【カレンダーから日付選択】

皆さん、こんにちわ。

U_OK_2023 です。

 

本日は、午前中、大阪へ面接に行って参りました。
結果は、1週間以内には、とのこと。
面接後、少し大阪を散策し、帰宅しました。

本日も、オリジナルアプリの実装です。

今回は、タスク投稿機能における「期日」を
入力フォームから選択できるように実装をしました。

app/views/tasks/new.html.erb

<%= f.date_field :deadline, class:"input-default", id:"deadline" %>

出力結果

この「期日」は このアプリケーションの 要 となります。

しかし、f.date_field と記述するだけで
(実際にはマイグレーション他、設定していますが)
カレンダーから日付を選択できる仕様になるなんて
かっこいい演出ができることに感動しました。

これからバンバン使っていきたいなと思いました。

【バックスラッシュ記法】RubyコードにてHTMLを表記中に改行する方法【option + ¥】

皆さん、こんにちわ。

U_OK_2023 です。

 

本日は、オリジナルアプリを作成中に、
「改行」を入れたかったので、備忘録として残します。

RubyコードにてHTMLを表記中に改行する方法

結論

\n で改行できます。

バックスラッシュ記法使用方法:option + ¥ で 「\」バックスラッシュを入力 + n

***.html.erb

    <%= f.text_area :description, class:"input-default-task", id:"description", placeholder:"例) 割引率5%, 10% の2パターンを作成\n送信先(FAX番号, メールアドレス)\n(株)タスク 部長 日々積 様", maxlength:"500" %>

出力結果

https://i.gyazo.com/79794be52d60c8f786dbec42c4b714d0.png

しっかりと改行することができました。

バックスラッシュ記法には他にも種類がありますので、
参考に載せておきます。

記法 意味
\n 改行
\t タブ
\b バックスペース
\\ バックスラッシュ

 

【転職活動】企業研究【コミュニケーションを楽しむこと】

皆さん、こんにちわ。

U_OK_2023 です。

 

ここ1週間ほど転職活動に向けて企業研究をしていました。

実際に企業研究をするのは初めてで、どうすれば良いか分からなかったのですが、
自分で調べたり、色々な方のアドバイスをいただき、少しずつこういうことかな、
というのが分かってきた気がします。

昨日、私が卒業したプログラミングスクール「TECH CAMP」が配信されている動画のお知らせが届きました。

内容は、

「エンジニア転職の面接でよくされる質問5選」というものでした。

これは!と思い、ライブ配信を見ました。

詳しい内容は割愛しますが、
5選とは、
5つのジャンル(キャリア、学習内容、エンジニア適正、人間性、その他)に分類し、
それぞれに対して、どのような質問をされるかというものでした。

コメンテーターの方は、実際に面接官もされておられ、
面接官の方の気持ちを知ることもできました。

配信の中で頻発されていたのは、「言語化すること」ということ。
なんとなく分かっていることを
自分の言葉で言語化し伝えるということがとても大切であるということ。
そのためにはアウトプットをする習慣を身につけておきましょうということでした。

また、配信の中で印象的だったのは
面接で一番大切なことは、「コミュニケーションを楽しむこと」という言葉でした。

面接はとても緊張するものですが、
実際に面接官もされておられるコメンテーターの方が
「私たちも魅力的でここで働きたいと思ってもらいたくて必死なんですよ!」という言葉に目から鱗でした。

仕事内容や給与などに目が行きがちですが、
会社には個性があり、理念、ビジョン、ミッション、信念がある。
それに共感することができ、その実現に向けて頑張ることができるか。
それを知るための企業研究なのだと知ることができました。

【エラー】NoMethdError in Tasks#new【インスタンスを生成していなかった】

皆様、こんにちわ。

U_OK_2023 です。

本日も、朝から就活のために求人を探したり、
メールや通知の対応をしておりました。

その合間に、オリジナルアプリの続きをしております。
内容は、タスク投稿機能です。

 

早速、

エラー発生

ルーティングを設定し、コントローラーを記述し、対応するビューを作成。
ビューが表示されるか確認するために、 
localhost:3000/tasks/new へアクセスしたところでエラーが発生

https://i.gyazo.com/58f115928a02ebc1ae0fafd6ae076274.png

①何が問題でどうしたい

エラーを解決し、tasks/new ページを表示させたい

②現在(位置)

MVCにおけるV

③問題点

モデル が nil であるということ

④仮説

undefined method `errors' for nil:NilClass というエラーメッセージより、
値が空のためerrorsメソッドが実行できないということ。
今回のエラー箇所は <% if model.errors.any? %> の部分(ビュー(部分テンプレート)であり、 errorsメソッドの実行には、model に 値が設定されている必要がある。
model とテータのやり取りをしているのはコントローラーである。
newアクションを実行する場合、コントローラー内で、
初期化されている必要があるため、
@task = Task.new (初期化) が コントローラー で設定されているか確認する

⑤試したこと

1️⃣場所(存在するのか) 場所の確認
(そもそも見つからないと言われているものは存在するのか)

@task = Task.new の設定は app/controllers/tasks_controller.rb に設定するため 確認
→ 場所はある

2️⃣前提&置換((構文的に)正しく設定されているか)
前提の確認(記述の仕方は(構文的に)正しいか))
正しい構文で、値は正しく置き換わっているか

app/controllers/tasks_controller.rb に @task = Task.new の記述はなかった

⑥結果

記述を追加し、エラーを解決することができた

app/controllers/tasks_controller.rb

class TasksController < ApplicationController
  before_action :authenticate_user!, only: [:new]

  def index
  end

  def new
    @task = Task.new
  end
end

 

原因:

@taskインスタンスを生成していなかったため

解決方法:

@task = Task.new を追加

気付き:

MVCの流れを意識することでエラーの根幹に辿り着きやすくなってきた。
ルーティング → コントローラー → モデル → ビュー の流れ。
今回は、ビューでエラーが発生したため、
その一つ前の モデルに着目することで、
エラー解決の糸口を掴むことができました。

 

今回のエラーは、エラーを解決するための手順の基本になるなと感じました。
処理の流れや、値の生成、受け渡し を より理解できました。

【懸念解決】Ruby及びRailsのバージョン、beforeの謎【親子関係 end 位置を間違えていた】

みなさん、おはようございます。

U_OK_2023 です。

 

転職活動のために登録したサイトの登録情報を充実させていきたいと思います。
現段階では、まだ仮登録の状態なので、そこをしっかりと詰めていきたいと思います。

・・・

ということで、登録を完了することができました。
いよいよ本日から、応募していきたいと思います。

 

ここで、
ずっと気がかりなことがあったのですが解決することができましたので、
昨日の話をまとめたいと思います。

beforeメソッドです。

以前、このような記事を書いたことがありました。

uok2023.hatenablog.com

単体テスト中、beforeメソッドのブロックが動かず、
@user インスタンスが生成されないというエラーです。
最終的に、その時は なぜ beforeブロックが動かないのかを突き止めることができず、
各テストが実行される前に、
個別でインスタンスが生成されるように対応し、幕を下ろしたのですが、、、
このまま原因が分からないままでいいのか?と。

ですので、ダメもとで上記記事でも懸念があった
Railsインストール時のバージョン違い」を確認するために、
メンターさんに確認をしてみました。

結論

バージョンに問題はありませんでした。
というのも、バージョンには「Ruby」と「Rails」の 2つ がある。ということ。

***@*** *** % ruby -v                                                                           
ruby 3.2.0 (2022-12-25 revision a528908271) [x86_64-darwin22]
***@*** *** % rails -v
Rails 7.0.8

私の懸念は、 AWS導入時に、EC2初期設定において Ruby のバージョンを 7.0.0 ではなく、3.2.0 でインストールしてしまったと思っていたことでした。

そして、インストール後でも バージョンの切り替えは可能なのか。
については、結論 可能 とのことでした。
しかし、実装の途中段階でのバージョンの変更は非常に危険であるとのことで、
よほどのことがない限り、そのまま実装を進め、やり切ることを推奨されました。

基本的にバージョンは最新のものをインストールすれば問題はないとのこと。
では、最新のバージョンはどこで知ることができるのか。

Ruby

www.ruby-lang.org

もしくは、ターミナルで rbenv install --list と
コマンドを実行することでも確認できます。
現在は、3.2.2 が最新版のようですね。

***@*** *** % rbenv install --list
3.0.6
3.1.4
3.2.2

Rails はこちら

rubyonrails.org

本題に戻りますが、
バージョンに問題はなかったとすると、
before が動かなかったのはなぜなのか。

上記記事の内容を元に私なりの仮説をお伝えしたところ
メンターさんが最後にヒントを教えてくれました。

「親子関係を見てみてください」と。

はっ!?としました。

急ぎ、確認すると、おっしゃる通りでした。

親子関係

ここでいう親子関係とはネスト(入れ子構造)ですね。
細かい記述は割愛しますが、確認してみると以下のようになっていました。

RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end
end ←ここが根幹でした
  
  describe 'ユーザー新規登録' do
    context '新規登録できる場合' do
      it '***が存在すれば登録できる' do
        ***
      end
    end
    
    context '新規登録できない場合' do
      it '***が空では登録できない' do
        ***
      end
    end
  end

この記述では、beforeメソッドで @userインスタンスを生成しても、
describeメソッド内で @userインスタンスが使えない状態になっています。

正しくは以下のようにしなくてはいけませんね。

RSpec.describe User, type: :model do
  before do
    @user = FactoryBot.build(:user)
  end
  
  describe 'ユーザー新規登録' do
    context '新規登録できる場合' do
      it '***が存在すれば登録できる' do
        ***
      end
    end
    
    context '新規登録できない場合' do
      it '***が空では登録できない' do
        ***
      end
    end
  end
end ←ここに移動させました

修正後、再度、テストを実行すると、
無事に単体テストをクリアすることができました。

結果論にはなりますが、懸念をそのままにしなくて良かったと思いました。

懸念は解決し、
beforeメソッドの謎も解明することができたくさん学びがありました。

基本に忠実に実装をしていこうと思います。

メンターさん、ありがとうございました。

【就活】求人サイト登録【Green, DODA, エン転職】

本日は、3/8(金) テックキャンプ卒業と同時に、就職活動を開始するにあたり、
求人サイトに登録をしました。

私の現状を考えると、
キャリアアドバイザーより
「月に100件 応募して 1件内定が出れば良い方だ」
とのお言葉をいただいております。

よって、目標は「月に 100 件の応募ができる分母を集める」ことです。

 

目標を実現するために

 

登録した求人サイト

求人サイト1つ目:Green

求人サイト2つ目:DODA

求人サイト3つ目:

 

1つ目、2つ目に関しては、
キャリアアドバイザーよりおすすめしていただきましたので
登録させていただきました。

残り1つに関しては自分なりの考えで決めたいと思います。

3つ目のサイトを決めるための指針

1:IT特化型であること

理由:IT業界で働くと決めているため
働く業界を決めているなら、その業界の求人が多く掲載されている求人サイトを使用することで効率良く、求める求人に巡り会える可能性を広げられると考えています。
また、業界特化型ということは、

求人サイトサイドのことを考えると、
その業界に対する理解が深く、掲載されている情報の質や信憑性は高いと考えられる。

掲載企業様サイドのことを考えると、
他業種の掲載がある求人サイトではなく、
業界特化型の求人サイトを利用されているということは、
それだけIT業界に対しての意識が高い人材を求めておられるのだと考えられます。

2:自分の年齢、未経験に対応していること

理由:現状から可能性を最大限に広げるため
私は現在38歳、ITでの職務経験はありません。
IT業界においての再就職は厳しいとされている年齢です。
その現実を受け入れ、
努力ではその事実(38歳で未経験という事実)をどうにもできないことに対して、
どう動いていくのかを考えます。
どれだけ、その業界の求人情報が多く掲載されていたとしても、
現状を受け入れてもらえなければ、就職することはできません。
しかし、掲載情報はあくまでも絶対条件ではないと考えています。
求人の中には、「未経験可」&「39歳まで」 という条件の求人は少なからずあります。
そのような内容の掲載が多い求人サイトであれば、
もし「未経験可」&「39歳まで」という条件としては求人を掲載していなかったとしても、私の現状に対しての理解を示してくださる企業様と巡り会える可能性は高いのではないかと考えました。

 

指針の条件を満たすために行ったこと

1:IT特化型求人サイトを集計

まず、IT業界に特化したサイトはどれくらいあるのかを調べました。
検索に「求人サイト IT特化」と入力するとすぐに出てきます。

私は1つのサイトだけでなく上位3つほどサイトを閲覧し
集計を取るようにしています。

 

参考にしたサイト

uppp.jp

career-town.net

www.engineer-career.net

集計した結果

  サイトA サイトB サイトC
Geekly Green レバテックキャリア
リクルートエージェント(IT) レバテックキャリア Geekly
レバテックキャリア マイナビ IT AGENT BIZ REACH(IT)
BIZ REACH(IT) Geekly  

 

余談ですが、
上記、表の挿入方法はこちらのサイトを参考にさせていただきました。
解説がとてもわかりやすくしたいことをすぐに実現することができました。
ありがとうございます。

joujilog.com

 

Geekly と レバテックキャリア の 2つ を候補にし、
どちらか 1つ に絞りたいと思います。

www.geekly.co.jp

career.levtech.jp

 

2:上記2つのサイトにて「未経験」「38歳でも可」の条件での求人数を調べる

結果

Geekly

案件を閲覧する前に「無料転職サービス登録」をする必要があります。
情報登録後、連絡があり、現状などをヒアリング後、
履歴書と職務経歴書の提出をお願いされるので、
事前に準備しておくとスムーズかと思います。
但し、「未経験」だとやはり紹介できる案件は少ないとのことでした。
Geekly に関しては、自分で求人を調べるというよりは、
紹介されたものに対して、対応する流れなのかな?と感じました。

 

レバテックキャリア

案件を閲覧する前に「無料登録」をする必要があります。
情報登録後、メールが届きました。
3営業日以内に担当者様よりヒアリングのために連絡があるそうです。
その間に、履歴書と職務経歴書のお願いをされました。
そして、待機中に、求人情報を閲覧することができます。

サイト内にて検索をした結果は以下の通りです。(2024年3月6日 現在)
「未経験」と検索:約2300件
「未経験」+「希望する職種」:約160件

いくつか求人内容を確認したところ、
必須条件の中に「年齢」は全く含まれていませんでした。
掲載上、どのような意図があり
全く「年齢」に触れられていないのかはわかりませんが、
私は前向きに捉えたいと思います。

3:調べた結果を元に可能性を判断する

Geekly
現段階では、求人を閲覧することもできないため 判断は保留とする

レバテックキャリア
希望する職種に関しては「勤務地」「給与」などは検索項目に含まれていないため、
さらに応募できる求人の分母は少なくなることを考えると
可能性を広げるために「登録する」が、
これで安心できる状況ではないと判断した。

応募できる分母を増やすために

現段階で調べて分かったことは、
現在、自分で探すというより紹介してもらうスタイル傾向にあると感じました。
しかし、主体性に欠けると感じました。
紹介 + 主体的に求人を探し応募する この2本柱が
応募できる分母を増やすために重要であると考えました。
よって、ここからは
「紹介ではなく自ら求人を探し応募できる求人サイト」を探していきます。

 

そこでまず、

  サイトA サイトB サイトC
Geekly Green レバテックキャリア
リクルートエージェント(IT) レバテックキャリア Geekly
レバテックキャリア マイナビ IT AGENT BIZ REACH(IT)
BIZ REACH(IT) Geekly  

 

先ほど、候補から外した
リクルートエージェント(IT)
マイナビ IT AGENT
BIZ REACH
について、「自ら応募できる求人サイト」なのかを調べます。

自ら応募できる求人サイト なのか

リクルートエージェント(IT)

www.r-agent.com


自ら応募できるサイトである。
補足:
基本情報を入力する必要有り、面談予約をする必要がある
転職支援を受けることができる
よって、紹介 + 自ら応募するスタイル
「業界・職種未経験」「希望する職種」での検索結果は 約 15 件


マイナビ IT AGENT
自ら応募できるサイトではない。
補足:
マイナビエージェントへ登録する必要がある
面談予約後、求人を紹介してもらい応募するスタイル

BIZ REACH

www.bizreach.jp

自ら応募できるサイトである補足:
無料会員登録が必要
会員登録後、基本情報を入力
転職サポートなどの促しはない

求人を見てみると「未経験」というよりは、
「経験者」に特化したサイトである印象でした。



結果:リクルートエージェントが有力だと判断しました。

 

しかし、もう少し 分母が欲しいので、
他にないか調べてみます。

 

候補サイト

マイナビリクナビ
type
エン転職
indeed

 

ピックアップ

エン転職

employment.en-japan.com


理由:以前転職活動をしている時にも使用したことがあり印象が良かったため
補足:
自ら応募できる求人サイトである
転職サポートなどの促しはない
履歴書・職務経歴書が準備できていればスムーズに登録ができる
「業界・職種未経験」「希望職種」「希望勤務地」での検索結果:約70件
いくつか求人を見てみたが「年齢」については
必ずしも条件には含まれていなかったため可能性を感じたため。

 

結果:エン転職を3つ目のサイトとしようと思います。

 

終結

求人サイト1つ目:Green
「希望職種」「業界・職種未経験」「希望勤務地」検索結果:約420件

求人サイト2つ目:DODA
「エンジニア」「業界・職種未経験」「希望勤務地」検索結果:約200件

求人サイト3つ目:エン転職
「希望職種」「業界・職種未経験」「希望勤務地」検索結果:約70件

(レバテックキャリア、リクルートエージェントを併用していく)

メインの3サイトの求人件数:約700件
ここから絞られて2割残ったとして、約140件
油断するつもりはありませんが、まずはここから始めたいと思います。

 

ここからは、上記5つのサイトにて、
登録情報を充実させ、3/8(金) からの転職活動開始に備えたいと思います。