【本紹介】岩田さん

プログラミングスクールに通っていた際に何度となくお世話になった本です。

少しでもこの本の良さをお伝えできたらと思います。

 

岩田さん - ほぼ日刊イトイ新聞

 

[1] 概要

任天堂の元社長で、岩田聡さんのことばをまとめた本です。

ほぼ日刊イトイ新聞というサイトに掲載された、

たくさんのインタビューや対談

任天堂公式ページに掲載された「社長が訊く」シリーズから

重要なことばを抜粋して再構成されています。

全7章構成になっています。

 

[2] この本との出会い

スクール受講前ぐらいの頃に

Youtubeを何気なく見ていたら、おススメに(またかよ)

岩田聡さんの伝説をゆっくり解説している動画がありました。

 

もともとファミコン時代からゲームがずっと好きでして。

それがきっかけでプログラマーにはちょっと憧れていたのです。

だからか、岩田さんの事は天才的なプログラマー

「マザー2制作危機の際に有名な言葉を言った方」ぐらいの認識はあったのです。

 

しかし、動画を見ていくうちに

この方は人間的にも経営者的にも素晴らしい方だったのだな

と、感じるようになり。

岩田さんの本が出版されていることは知っていたので

即、取り寄せたのです。

 

奥さんは表紙の絵がお気に入りで、そっちが理由で読み始めました。

人間の動機って不思議ですよね。

 

[3] この本を読んで考えた事

この本を読むといろんな事を考えさせられるのですが

私的に大きかったのは

人の原動力は幼稚なものだ

って事でしょうか。

 

岩田さんがプログラミングを頑張ろうと思ったきっかけは

友人の笑顔が見たかったから

なのだと思うのです。

 

私がプログラミング(VBA)を始めたきっかけも上司が作ったマクロを見て

かっけえ!!

って思ってしまったからなんですよね。

仕事で活用したいとか業務効率を改善したいとか

偉そうな後付け設定はいくらでも出てくるのですが

原点は「プログラムかっこいい」なんですよ。

めっちゃ不順なんですよね。

でも、だからこそ頑張れたんです。

今も、勉強できるんです。

 

結果につなげる事が出来るモノって

こういうモノなのではないでしょうか。

 

岩田さんの原点は相手の喜んだ顔だったんでしょうね。

とても幼稚だけれど、とても素敵な事です。

 

岩田さんの根っこの部分に相手の笑顔を見たいという思いがあるから

仕事にもプライベートにも真摯に向き合ってこられたのだと思うし

結果につなげることが出来て

周りの方々にもそれを伝える事が出来たのだと思います。

 

だからこそ岩田さんがお亡くなりになられた後も

一冊の本を作れるくらい沢山の言葉が

関わっていた方の心の中に残り続けていていたのだろうなと思います。

 

[4] 最後に

こんな内容でこの本の良さが伝えられたのか

すっごい微妙ですが

とてもいい本だと思います。

 

誰かの名言って本が好きで何冊か集めているのですが

面白いと思う反面、なんというかちょっと偉そうに聞こえて

すっと心の中に入ってこない時があるんです。

 

でも、岩田さんの本はそういうことがなかったんですね。

本の中から岩田さんの人となりがにじみ出ていて

言葉がガンガン心に届くというか・・・。

 

一度も会った事ないのになぜなんだろう。

 

不思議なのですが、実際そうなのだから仕方がない(笑)

 

www.1101.com

 

上のURLからほんの半分くらいが読めるそうなので

先ずはお試しで読んでみて頂けると嬉しいです。

 

後、私がこの本を読むきっかけとなった動画も紹介させてください。

 

www.youtube.com

 

 

転職後一か月を振り返る。

新しい職場で働き始めて一か月がたちました。

(3月1日にアップしようとして忘れてました・・・。)

 

色々と楽しい一か月だったので

一週間ごとに振り返ってみました。

 

守秘義務などもあるので、ある程度ぼかして記述しています。

ご理解いただけたら幸いです。

 

 

第一週:新しい職場での仕事の開始。

初日はもう、緊張で落ち着かなかったですね。

なんだか、あっという間に一日が過ぎたようでした。

 

私が所属するチーム(課)は全部で9名。

課長が二人に課長補佐が二人、主任が二人。

通常社員(という名のエース)が一人。

そこに私と同期が入って計九人体制です。

 

統括部長に仕事の簡単な内容や各資料の説明を受け

その後

他部署の部長と顔通しをし、社長から辞令をいただき

気が付いたらお昼です。

 

午後はいただいた資料を確認したり

各部署の方々に顔通ししていたら一日が終わりました。

 

二日目から実践開始なのですが

交流を含めて各先輩が一日横にいてくれながら

各仕事の説明を行ってくれます。

 

最初の一週間は

実践とは名ばかりのチュートリアルとでもいうのでしょうか。

 

未経験で入った職場なので

何が何やら、解らないことがわからないという状態でして。

 

ただひたすらに、先輩たちに質問しまくっていました。

 

普通に考えたら、

自分よりも年上の、しかも私のようなおっさんに質問攻めにあって

先輩たちは大変だっただろうなと思います。

 

先輩方ありがとうございます。

第二週:別課で研修。

第二週目は別チーム(課)の方たちについてもらって

実戦形式チュートリアルです。

 

こちらの課、人数は私の所属しているかよりも少ないのですが

「少数精鋭」という言葉がぴったりなチームで

しかも若い。

 

同じ内容の質問をしても帰ってくる答えがまた違って

楽しい、楽しい。

 

一週目、二週目で気を付けたこと。

この週でとにかく気を付けたことは

 

私が前職で経験してきたこと、は一旦置いておいて

今の職場の雰囲気(常識)に慣れよう。

 

ということでした。

 

会社である以上そこにはルール(常識)があって

今までの経験で出来上がったルール(常識)との差異に

先ずは慣れることが大事だと考えたからです。

 

アインシュタインさんの名言の中に

常識とは十八歳までに身につけた偏見のコレクションのことをいう。

というものがありまして

 

変な先入観や決めつけは自分の為にならないし

何より、自分で決めた転職なのですから

先ずは自分の中の前職での経験(偏見コレクション)を端に追いやって

新しい価値観や考え方を学び、

その中から以前の経験を活かせないかを模索していった方が

会社の為になるのではないかな。

と、思ったのです。

 

それが成功しているのかはまだ分かりませんが

 

先輩たちとのお話で為になったこと。

先輩の話を聞いていると

皆さん考え方や仕事に対してのアプローチの仕方に少々の違いはあれど、

前向きなのですよね。

 

「攻め」と「守り」で言えば、「攻め」る方ばっかりというか。

 

DQ的に言えば「ガンガン行こうぜ」が7~8割がたを占めているのですよ。

 

新たな技術・知識を得る事にも貪欲ですし

私に対しての教育だけじゃなく

こちらの話もちゃんと聞いてくれて

その中で使えそうなこと・改善した方が良いことがあったら、提案してくれる。

 

そして皆さんが、お客様の為を第一に考え行動している

 

事がひしひしと伝わってきました。

 

正直に、いい会社に入れたと思いました。

 

第三週:一人でやってみよう。

事前に説明を聞いていましたが

今週からはある場所を任されて自分一人で仕事開始です。

 

「任されて」と言っても、何かあれば先輩に聞けますし

最後の一時間くらいは復習を兼ねて仕事内容の報告と

それに対するフィードバックをしていただけます。

 

フィードバックってすごいね。

 

驚いたのはフィードバックに関してで、

一人がしてくれるのではなくて最低でも3人くらいで

多いときはチーム(課)の皆さんでしてくれるのですよね。

同じ課の先輩方7人だけでは無くて

他のチーム(課)の方もたまに顔を出してフィードバックをくれる。

その誰かがくれたフィードバックに対して

他の上長がさらにフィードバックをくれる。

 

みんなで良くしよう。考え方をアップデートしよう。

こんな考え方もありなのでは?

 

皆さん忙しそうなのに、雑談も交えて・・・。

 

仕事に対して真摯なのだな~と感じました。

 

第四週:一人でやってみよう(二回目)。

四週目も三週目と同じく一人で試行錯誤がメインなのですが

ZOOMで全チーム(課)での会議をしたことが印象深かったです。

 

参加できるのは役職についていない方だけという放任ぶり。

 

議題だけ出されて議事録は取らないから、思い思いの事を話す。

 

こういうのってグダグダになっちゃうのでは

なんて考えていたら、内容は全然違って皆さん意見出しまくり。

 

こりゃ、おじさんもうかうかしてられないと

襟をただす思いでした。

 

三週目、四週目で気を付けたこと。

この週で気を付けたことは「試行回数を上げる」でしょうか。

「とりあえずやる」「ガンガンいこうぜ」と置き換えてもいいかもです。

 

未経験である事の最大の利点は「知らない」と言う事だと思うのです。

 

上達の近道は失敗する事。

失敗(成功)を糧に出来るように試行の後は復習する事。

 

資料読んで、気を付ける事、やっちゃダメな事、という知識を付ける事

に気を配っても実践できなければ意味はないですし

学びにもつながりません。

 

ゲームは持ってないのにそのゲームの攻略本読んでるようなもの。

 

嗜好品であれば良いのですけど、仕事なので。

 

またまた、アインシュタインさんの名言から

 

何かを学ぶためには、自分で体験する以上にいい方法はない。

 

もう、これに尽きると思うのです。

 

なんだか2月はアインシュタインさんの名言ばっかり読んでた気がする。

 

名言集

私は

ディスカヴァー・トゥエンティワン」という出版社さんから出ている本を持っているのですが

サイトを見つけました。

iyashitour.com

 

個人的には岩田さんの本もおすすめです。

 

今度岩田さんの本の紹介をしたいですね。

 

ただ、紹介できるような文才が私にないことが気がかりです。

テックキャンプ受講を経て、転職した話②〜就職活動から転職へ〜

後半です。

なんとか、テックキャンプさんを卒業できたは良いものの

就職活動が自分的にはかなり暗雲の中を進んだ気がしていたので

内容はくらいかもです。

11月:オリジナルアプリ作成

就職までの道筋を考える

無事テックキャンプを卒業できまして

これからは就職活動を本格的に始まることになるのですが

本格的に始める前に自分の中でこうやって就職活動を行おう

と言う道筋を立ててみました。

私にとって転職活動は初めてのことでもあるので

ある程度の目標を先に立てておかないと続かないなと思ったためです。

  1. 12月中旬までは平日2時間程度ハローワークメインで企業様確認
  2. 12月中旬までにはオリジナルアプリを見れるものに仕上げる。
  3. 12月下旬からは企業様を調べる事と面接対策をメインに変更
  4. 12月下旬以降も最低でも2時間プログラミングの勉強をする。
  5. 1月までに内定をもらい転職を果たす。

こんな感じです。

この事をキャリア・アドバイザーさんとの面談初回にお話ししたら、

「いいですね〜!お任せします!」

って言っていただけて勇気もらいました!

ありがとうございます!

目標1.平日は2時間程度ハローワークで就職先企業様を調べてみる。

テックキャンプの受講中

最終課題を企業様に見せても評価はいただけません。

と、念を押されていた事と、

私自身、前述のオリジナルアプリ作成の時に感じた。

最終課題は自転車の補助輪を外して自走できるお手伝い程度の物

と言う意識がありましたので

履歴書には載せるけどメインにしちゃダメだろう

と思っていたのです。

思った理由は簡単で

オンライン受講だと

一回の「期」で大体100名くらいの受講生がいて

一月に前期と後期の2期づつ応募を募っていた様でしたから

オンライン受講生だけでも単純計算、

一月で約200個の最終課題が出されるわけですよね。

みんなが同じ物を作る訳だから、オリジナリティに欠けるし

面接官が見たいものはそんなものではないだろうとも思えるのですよね。

それでも、何件かは魅力的な企業様を見つけて

されている事業内容や経営理念が素晴らしいと思えて

時期的にはオリジナルアプリの仮完成頃には採用決まってるかもとか思い

ダメもとで履歴書を送らせていただきましたが

当然、予想通り書類選考で落とされました。

送らせていただいた企業様、人事担当者様

ご迷惑をおかけして申し訳ございませんでした。

目標2.勉強を兼ねて11月中はオリジナルアプリの作成をメインにおく

とりあえずの期限を決めてオリジナルアプリの作成に注力しました。

やっぱり期日が無いと私はダメな様です。

ただ、自分で一から作り上げるのは相当に難しく、

一つの機能を追加するだけで1週間近くかかったり

実装できてもビュー(お客様が見る画面)の使い勝手が悪くて微調整を繰り返したり

記述している側から新しい機能をつけてみたくなったり

それを調べていたら、いつの間にか1日過ぎていたり。

「ああしたい」「こうしたい」「これはどうだろう」と、後から後から

思いつくことや気づきが多過ぎて、メモ取っていたらメモが多過ぎて

何書いてるのか迷ってしまって捜すのに苦労したりと

毎日尻に火がついている状態でした。(このフレーズ好きなのか?)

ただ、この1ヶ月が最高に楽しかったです。

ただ、筋トレとかサボりまくったので体はダルダルになりました・・・。

 

 

キャリアアドバイザーさんの存在

テックキャンプ卒業間近になると

一人に一人、専属のキャリア・アドバイザーさんがついてくれて

日々の過ごし方や就職活動を行う上でのポイント

提案やダメ出し(ダメ出しめっちゃ大事!)をしてくれます。

前半のブログにも書きましたが、就職活動は自分で行う気満々でしたから

キャリア・アドバイザーさんがついてくれた時はびっくりしました。

まじで??ほんまに??

聞き返しちゃいましたよ。

キャリアアドバイザーさんの感想

本当に感謝しています!ありがとうございます!

やっぱりオリジナルアプリの作成状況が悪いと理由も知りたくなるし

つけてみたい機能がぼんやりしていると検索するのも一苦労なんですよね。

そう言う時に相談するとすぐにヒントをくださって

しょうもない話ですが、

タイピングが上手くならないなんて愚痴に近い話をしたら

こうすると上手くなりますとか、こんなグッズがありますとか

こんなしょーもないことに親身になってくれるのです。

面接の練習や、履歴書の添削とか本当にありがたかったです。

詳しくは話せませんが

div(テックキャンプを運営されている会社)さんの社員なのに

こんな発言していいの??

とかってのもあり、

逆にいうと、会社関連抜きで

私の就職活動成功を本気で考えてくれている

と言う実感をひしひしと感じていました。

お陰で、毎週の面談が楽しみで、

何かいいアナウンスしたいとがんばれました。

また、基本的に私の考え方で就職活動を進めさせてくれたことも

ありがたかったです。

やっぱり自分の就職なので、自分で責任持ちたいし

上手くいかなかった時に

キャリア・アドバイザーさんのせいにしたくないですからね。

快く引き受けてくれて「お任せします!」と言ってくれたことが嬉しかったです。

本当にありがとうございます!!

12月上旬:チームメイトが採用される!

84期iチームから採用者現る!すっごい嬉しい!はっやい!

おめでとうございます!!

もうね〜、受講中から考え方、理解度の速さ、

物事に対しての真摯さ、そして相手を思いやる気持ち

が、溢れかえっている方だったので

聞いた時は嬉しかったのですが、「やっぱり」と言う感じでした。

これは後に続かなきゃ!と気合が入ったのですが

ちょっと嫌な内容も耳に入ってしまいました。

就職活動に対しての私の心構え(嫌な話)

これからお話しする内容は私個人が思っていることなので

気分を害した方は申し訳ございません。

一意見としてご覧いただければ幸いです。

私は前職で店長や店次長と言った身分にいたものですから

店舗の状況によってはアルバイトさんの面接などの

人事関連の仕事も行なっておりました。

その際に思っていたことなのですが、面接って結構な重労働なんです。

ぶっちゃけ、あまりしたいモノではない。

だってですね

履歴書や内容物(職歴や成果物)の確認、日取りの選定、

志望者の年齢などから事前に採用後の教育担当者の人選も必要ですし

そうなると教育担当者が抱えている仕事を軽減させて

教育にも気を配れる様にしておかないといけない

当然そこにコストもかかる。

しかも、

志願した方は不採用であったとしても未来のお客様の可能性もあるので

対応を疎かにすることはできない。

それに、こう言う案件だけをしている訳でもなく

大体は別仕事みたいなモノでもあるので、

本業は本業でしっかりするセルフスケジュールも大事。

と、アルバイトさんの面接であっても、これだけ気を使うのに

正社員採用であれば心労は如何なものか

私も、前述の通り、あまり良いタイプの履歴書送付はしていませんので

人事担当者様に申し訳ないな〜とか思っていたのですが

テックキャンプ卒業から1ヶ月程度の間に

100社を超える企業様にエントリーした方がいたそうなのです。

その方がどうなったのか詳しくは存じ上げませんが

話を聞いてびっくりすると同時に、

人事部の方も大変だっただろうな〜と思ってしまったのです。

 

新店立ち上げのときの、

あの面接の日々を思い出してガックリきてしまいました。

この時期から、企業様の確認はもちろん継続するのですが

別途で企業様の説明会に参加させてもらう機会を増やしました。

やっぱり働かれている方の生の声を聞いて

調べるだけではわからない企業様の空気を知ることが

一番なのではないかなと思ったからです。

12月下旬:トラブル発生

PCが一時的に使えなくなる。

パソコンが壊れてしまったのか

しばらくコードの記述ができなくなっちゃいました・・・。

自分の現在の知識力(とでもいうのかな)を、思い知りました。

パソコンの環境設定方法を知っているって無茶苦茶大事ですね。

MacPCを持っている人って私の周りにはいないので

WindowsPCの設定ってよくわからなくて。

テックキャンプさんに通うまでは

PCってエクセルとYouTube見る機械っていう認識しかなかったのですが

でも、その方法を理解していなければ、結局同じことだと。

今の私の実力ではまだまだ、敷居の高いモノなのだと思い知らされました。

前述の自転車で例えると

補助輪は外せたけど、補助輪の外し方はわからない。って感じですかね。

と、同時にやっぱりコードを書くとかの手を動かすって事をしないと

理解した気にしかならないって事も再認識できました。

考えながら手を動かす。失敗・成功を繰り返して理解が深まる。

当然と言えば当然なのですが

今、プロとしてプログラミングをされている方って凄いんだなと思いました。

そして、私自体の精神状況も暗くなって行きました。

目標が中ぶらりになる。 

12月後半、特に年末年始はテンションがめっちゃ低かったです。

一番の理由は当初の目標期日から遅れているという事実です。

退職を決意した時点での目標としては

12月までに転職を完了させて1月からは働き始める

という物でした。

しかし、テックキャンプさんを受講し、

学習内容を終了したのはスケジュールギリギリでオリジナルアプリは手付かず。

これじゃ駄目だと思い直し、一月分伸ばして目標を設定し直したのですが

  1. 働いていない期間が長すぎる・・・。「働いていないという」負い目を強く感じてしまう。
  2. オリジナルアプリも一応、メインでつけたい機能はつけれたけれど使い勝手や見た目の改善をしたい。しかし、追加機能をつけようとするとエラーが起きる。
  3. 就職活動をするためには企業様の情報を集めて、自分がどの様に貢献できるか考える時間が欲しい。

と、焦りから1の内容で危機感だけが募っていき

2と3でどちらに時間を費やすのがいいのかウンウン悩むばかり。

考えが堂々巡りをしている状態で

周りが見えておらず、袋小路に入っている感だけはひしひしと感じて

早く抜け出したい!って気持ちでいっぱいでした。

不安から逃げ出したくて、ゲームとかで現実逃避したりもしてました。

でも、キャリア・アドバイザーさんからの一言で吹っ切れます。

未経験というのはわかり切っているのだから、

先ずは企業様を確認して、自分がそこを楽しめるかを考えた方がいい

と後押ししてくれたのですね。

でも、やっぱり不安にはなるのでオリジナルアプリの充実を図ったり

ゲームに逃げたりもするのですが、

1日の時間のほとんどを企業様の情報収集に費やすことに踏ん切りがつきました。

1月:会社説明に招かれる。

1月に入り会社説明をお願いしたり、呼ばれる様になったりします。

説明会を開いていただけた企業様は何処も楽しかったですね〜。

会社説明会=仮面接

会社説明会自体が、面接も兼ねていると思って挑みました。

企業様のHPの内容を見ていて気になった事や

お話の内容から気づいた事や、提案などを行ったり

これからの抱負や、その抱負に対してどんな事をするつもりかなどなど。

どの会社説明会でも、面接ほど緊張する事なく話が出来たと思います。

キャリア・アドバイザーさんの助言通り、企業情報を集めていてよかった!

また、実際の面接の前に、知っている方が居ることで

本面接時の緊張緩和にもつながりました。

いざ、面接!

会社説明を聞いて楽しそう!って思った企業様へ履歴書を持ち込みに行ったら、

その日のうちに連絡が来てとんとん拍子で面接の日取りが決まりました。

面接当日は会社説明会で対応してくれた方もおられて、ちょっぴり安心感。

しかし、面接官5名とは予想外だった・・・。

説明会でお話しいただいた内容から、あらかた聞かれる内容も予想できたし

ポートフォリオ(制作物一覧を記載した自分のホームページ)も確認いただき

及第点も頂けたりと、自分では手応えを感じられる面接でした。

ただ、私以外にも面接をしている方がいる事や、

二次面接の存在も知っていたので、返事が来るまでは気が気ではなかったです。

二次面接は免除

結果的には二次面接は無しで採用との事でガッツポーズしちゃいました。

どうやら、私が思っていたと同様に企業様も説明会=面接だったそうです。

他の面接官の方々にも事前に私の事を話されていたそうで

本面接はその微調整だったそうです。

 

 

そして、キャリア・アドバイザーさんへ報告を済ませ、

修了証をいただくことができました!

ありがとうございます!!

私なりのテックキャンプさんに思うこと

環境がすごい

正直な話をすると、教材のわかりやすさもさることながら、

随時尻を引っ叩いてくれる環境

が、ありがたかったです。

チームの皆さんのモチベーションも高いため、それに引っ張られるし。

毎回のアウトプットやライフコーチさんとの面談とか、

チョコチョコ発生するイベントとか

自分で何か提案・実行し続けないといけないなって言う雰囲気作りが

巧みだなと思いました。

今回、採用をいただいて、

統括部長さんとお話が出来たのですが

その時に、口調はやんわりとなのですけど

自分でスケジュール管理ができない人に興味はない

その点を確認できたのが大きかった

と言う様な、お話をしていたのですよね。

なので、自分でも気にしている事、でも意外と継続するのは難しくて

ついついサボりがちになってしまう自己管理を

飴と鞭を使ってじっくりとでも強烈に矯正してくれた

テックキャンプさんは本当に受講して良かったと思っています。

高額であることの意味を自分で考える

70万円は高い?

私的にはNOです。

理由は意識を変えることは相当に難しいことだからです。

前半でも書いた事ではありますが、

MacPC含めて、100万円近い出費をするので

後戻りできないと言う危機感を強く感じます。

だからこそ集中するし、勉強しようと貪欲になると思います。

少なくとも、私の周りの方達はそうでしたし

退職して独学で出来たかと言うと多分出来なかったと思うのです。

もうちょっと付け加えると、

退職したことに加えて、100万ほどの出費を行ったので

他の娯楽ゲームや買い物を控える様にもなったんですよね。

そのお陰で、勉強に集中できたという側面もあると思います。

テックキャンプさんの学習中は本当になにもしていなかったです。

平日はYouTubeで「集中BGM」聞いてるだけの様な毎日でした。

誰だったか、偉そうな感じの人が

意識を変えようとか思うのではなくて

生活環境が変わらないと、意識は変わらない

って言っていたのを思い出しました。

そういう意味で、

この100万はすごく自分にとっては有意義なものだったと思えます。

これからも自分磨きを続けていくための初期投資ですね!

 最後に

ここまで読んでいただき、ありがとうございました。

今はまだ採用いただいただけ、スタート地点に立てただけ

これから、採用いただいた方々へ恩返しをするためにも、

支えてくれた、テックキャンプのスタッフの皆さんへの御恩返しのためにも

何より、私の我が儘を聞いてくれた家族への御恩返しのためにも

さらに頑張っていく所存です!

テックキャンプ受講を経て、転職した話①〜受講開始から卒業まで〜

やった〜!!やっとですが、転職に成功(内定をいただけた)いたしました!

概ね予定通りとはいえ、やっぱり1月はコロナのせいもあり肝を冷やしました。

テックキャンプを受講させていただいてから、転職に成功するまで約6ヶ月。

長かったなぁ〜。

と、言う訳で、この半年を振り返ってみようと思います。

※あまりに長文になったので分けました。こちらは、受講から卒業までの内容です。

7月〜8月中旬:受講のきっかけとテックキャンプ授業開始

プログラミングスクールを受講した経緯

どこでテックキャンプさんの存在を知ったか

テックキャンプさんを知った経緯は単純に、「YouTubeで広告を見たから」です。

そのころの私は福岡県の本屋さんで店次長をさせていただいておりまして

家族の事情もあり、2020年の2月で退職しようと思っていました。

色々な事情とコロナが重なり伸びに伸びて9月いっぱいでの退職となりましたが。

で、退職後の引越し先で新しい職を探す前に、プログラミングを学びたい!

と思ったのです。

プログラミングを学ぼうと思った理由

13年ぐらい前に、

独学でお客様管理のシステムをVBA(エクセルのプログラム)で作ったのです。

そのころは、自分のパソコンも持ってなくて

会社のパソコンを仕事終わりにお願いして借りてました。

Rubyなんて、存在すら知りませんでした。

発案して、みんなに使い勝手を見てもらい、

改善案や提案を聞いて反映して、また見てもらって〜って感じで

3ヶ月くらいかけて作ったプログラムは結構好評をいただいて

改善を重ねながら

いまだに、系列店舗では使ってもらえてるみたいです。

ありがとうございます。

それとは別に、本部の意向で導入された発注システムがすごく優秀で

一気に今まで発注にかかっていた時間が短縮されて、

空いた時間を店舗運営に回すことができる様になったんです。

もう、プログラミングすげえって!思っちゃいまして・・・。

退職を機に

今までの様にたま〜の仕事終わりに他の社員の様子を見ながら

コソコソ本を片手に勉強を行うよりも

ガッツリ勉強したい!

と、思ったのです。

テックキャンプさんと言うプログラミングスクールを選んだ理由

YouTubeで広告を見たから!ではなくて、

一応他のテックアカデミーさんや侍エンジニア塾さんも確認させていただいて

自分に合っているなと感じたのがテックキャンプさんだったんです。

あまり深い意味はありません。フィーリングですね。

転職コースにはしてみましたが

ぶっちゃけ、転職保証とかどうでもよかったんですよね。

だって、宮崎にプログラマーの需要がたくさんあるとは思っていなかったし。

保証の対象の中に首都圏に限るって書いてありましたから。

(※私の見間違いです。)

就職先は初めから自分で見つけるつもりでした。

それよりも、

私は私自身を、

明確な目標がないと長続き出来なくてすぐ横道逸れる人間

と知っていますから、そこを補ってくれる誰かにいて欲しかったんですね。

テックキャンプさんの最初の印象

無料のオンライン相談を受けたときに、優しくでもしっかりと

「40歳台での転職はバイトから始めるくらいの覚悟が必要です」

と、キッパリ言われたのですね。

異業種に未経験で転職するって実績もない訳ですから給料安くなるのは当たり前で

でも、その当たり前を隠さずに、ズバッと言い切ってくれたのがとても好印象でした。

「大丈夫です!受講します!」即答でしたね〜。

正〜直、オンライン学習受講料の約70万円とMacPCの購入代金は痛かったのですが

こんな高額払うんだから後には引けんぞ・・・。

と、尻に火が付いている事を自覚出来て襟元を正しました。

まあ、その時点で退職願いは出しているので、実質後戻りできなんですけど。

1番の救いは家族の了承を得られた事ですね。

妻にはありがとうと言う言葉しか出てきません。

ありがとう!!

テックキャンプ受講開始

初日

8月17日よりいよいよ開始です!

先ずはパソコンでプログラムの記述とその結果を表示できる様に環境設定と

zoomやスラックなどのアプリを使った学習環境の設定を行います。

ぶっちゃけ言われるがまま設定して行ったので

設定内容の意味とかはいまだにざっくりとしか覚えていないです。

私は84期の「iチーム」。私を含めチームメイトは7名いました。

先ずは自己紹介とかでぎこちなさ爆発の和やかな出だしです。

学習の特色

テックキャンプさんの学習方法って結構独特なんだと思います。

  • 朝礼で瞑想と1日の目標を立てる。
  • 約1時間ごとにアウトプット(発表)の時間がある。
  • 勉強内容大量とメンターさん(先生)がいる。

大きく紹介すると三つかな。こんな感じです。

特色1:朝礼で瞑想と1日の目標を立てる。

瞑想で気持ちを落ち着かせたあと、

昨日の振り返りを行うとともに今日の目標を自分で定めて発表します。

学習スケジュールは事前に提示されていますが、

自分の進捗状況を考慮して、自分で逐次修正していかないといけません。

少し経過すると、ドリル問題が出題されるのでそこで復習も行えます。

特色1:「朝礼で瞑想」の感想

この朝礼、本当によかったです。

理由は明確で、自身の行動設定を決めると言う自己管理の練習ができるんですね。

後述しますが、勉強内容は膨大ですが、その消化期間はかなり短いです。

もう、毎日尻に火が付いてる状態を意識できました。(どっかで出た表現)

ここでのポイントは

達成するべき目標を明確に意識させた上で切羽詰まった状態にあえて置かせる

って事だと思います。

明確な目標があればがむしゃらにでもやりますからね。

それを再確認させるための毎日の朝礼だったのでしょうね。

各自発表もするので他の方の進捗状況で競争意識も芽生えますし。

ただ、やってる時はそんな事考える余裕なんかなくて

ヤバイぞ!本気でやらんとマジでヤバイぞ!!

最初の2週間(いや、結構その後もずっと・・・)はこんな感じでした。

ただし、そのヒヤヒヤを瞑想で地味に緩和してくれていた気がする。

考えた方、すごいな〜って思いましたね〜。

特色2:約1時間ごとにアウトプット(発表)の時間がある。

約50分の勉強時間と10分の発表時間を7回繰り返す様な時間設定になっています。

発表時間には2〜3人に別れて学習した内容をそれぞれ発表します。

発表する際は、相手にわかりやすく話す事を徹底させられます。

特色2:「アウトプット(発表)」の感想

これも、よかったです〜。

理由はこちらも簡単で

学習内容(インプット)と発表(アウトプット)をしっかり取られているからです。

中学生や高校生の時、友達に勉強教えてって言われて戸惑った事ないですか?

教えた後、次回から誘われなくなって凹んだことは??

ノート見せてって言われて、自分の字のあまりの汚さに躊躇したことは?

誰かみ見せてって言われるかもと思って、ひたすら丁寧にノート書いたことは?

貸したら、即コピー取りやがって喧嘩になったことは??

私は大学で教育学部に入ってまして

教育実習で下手くそな授業でもしようものなら

教育担当の先生から

「うちの生徒に何教えてくれとんじゃ〜」

って強烈に後ろから睨まれたものです。

ああ、思い出しただけで恐ろしい・・・。

誰かに聞かれる、見られるって下手なことができなんですよね。

すぐにバレるし。

しかも、説明する際は小学生に説明する様に話すこと!と念を押されます。

まじで、手を抜けない。

しかも、進捗状況は人それぞれなので

自分より先に進んでいる人のアウトプットは予習になり

自分と同等・後進の人のアウトプットは復習になります。

当然ですが、アウトプットは自分の知識の定着にもつながります。

理解の仕方や発表方法も皆さんの独自性が出るので聴いてて楽しいし。

アウトプットの時間大好きでした。

後になってですが、

アウトプットの時間が嫌いで何かしらの理由を立てては

アウトプットの時間をエスケープしている受講生さんがいると

メンターさん(先生)から聴いて驚いたものです。

幸いですが私がいたチームの方はアウトプットが皆さんお好きだった様で

ほとんどのアウトプットで欠席はなかったですね〜。

ありがとうございます!

特徴3:勉強内容大量と、メンターさん(先生)の存在

教材の内容は「基礎」「応用」「発展」「最終課題」の大きく4つに別れており

もう、まじで大量です。大量ですが教材はとても分かり易く作られています。

ただ、大量です。まじで大量です。(大事なところなんで二度言いました)

ぶっちゃけ学習スケジュールは

1日8時間計算で進みます。

が、

朝礼(これも学習)1時間

(50分学習時間+アウトプット10分)×7

時間合わなくね??

おまけに、学習スケジュール記載の1時間の教材って実際にしてみると

余裕で2時間とかかりますからね!

まあ、ここは自分の理解力と記述のスピードが問題なので

しょうがないですけれども!!!

それに、わからない時はメンターさんをお呼びして教えていただけます。

ただ、教材が分かりやすかったので基礎中はお呼びすることはなかったですね〜。

特徴3:「勉強内容と、メンターさん」の感想

教材は本当に丁寧で分かりやすくてありがたかったです。

検索機能も充実していてわからない所に素早くいけました。

教材の「基礎」範囲だけにはテストもあって

合格しなければ先に進めないと言う「壁」も用意されていました。

これも、明確な目標を見せて自己管理を促す一貫なんだろうな

と今になって思います。

また、メンターさんに関しても

答えてくれる内容・対応が教材の進捗内容で変わる

と言うのもありがたかったですね。

  • 「基礎」:とにかくわからなくても大丈夫だから何でも聞いてと言うスタンス。
  • 「応用」:エラーに関しては自分で先ずは考えてみよう。望むなら答えも教える。
  • 「発展」:エラーに関しては自分で仮説を立て対策までしなければ教えないよ。
  • 「最終」:こう言う考え方であっているのか聞く。基本自分自身で答えを探す。

ざっくりとこんな感じでした。

段階を踏むごとに距離を「いい感じ」で開けて行ってくれます。

でも、解決まではちゃんといてくれました。

特に最終課題は

各状況の関連性から考えて、やってみて、失敗したら再度考えて。

成功したら答え合わせとその理由を教えてくれるって感じですね。

30分ぐらいずっと繋がっていてくれて、解けた時に

「こう言うことだったんですよ〜」って補足説明してくれた時は

本当にありがたかったです。

また、「後は自分でしますからいいです!」って失礼なこと言ったのに

頑張ってくださいねって励ましてもらったことも嬉しかったです!

ありがとうございました!

9月:「応用」から「発展」に進む。

ライフコーチさんの存在とセルフメンテナンス

ライフコーチさんの存在

チームごとに一人の専属ライフコーチさんがついてくれて

日々の学習進捗や休日の過ごし方、各種イベントの管理をしてくれます。

週末には各自の学習進捗状況から休日の過ごし方の相談乗ってくれて

週明けは先週末の結果と対策を発表(アウトプット)し

それに関しての総評をしてくれます。

これがとても丁寧で的を得ていて大変参考になりました。

ライフコーチさんの感想

ただただ、感謝しかないです。

一応自分で学習進捗傾向に対して対策を考えてはいるのですけど

始めてする分野のことでもあるので

それが自分に合っているのか。その時点ではわからないのですよね。

通常であれば間違ったらその都度修正すればいいのですが

当然、その分時間をロスするんですよ。

でも、この短期間ではロスは極力省きたい。学習理解に力を注ぎたい。

一旦、ライフコーチさんに話すことで効果的か効率的か判断してもらえたり

学習の参考になるものや、技術を教えてくれる事が

本当にありがたかったです。

また、同じ84期生を集めてのエラー探し大会(正式名称忘れた)

を企画していただいた事が嬉しかったです。

いつもと違うメンツ(ほぼ初対面)でコミュニケーションをとりながら

ほぼ初めてのノーヒントでエラーを見つけるとか面白すぎました。

ありがとうございます!!

セルフメンテナンス

私が行ったものはすっごい単純な事です。後は継続するだけ。

  1. 朝5時前に起きる
  2. 散歩に30分、筋トレ・ストレッチに30分
  3. タイピングアプリ(e-typing)を朝・夕に最低5回ずつ
  4. 日々の学習時間とは別に朝夕1時間ずつ学習時間を持つ
  5. 1〜4を毎日スラックでみんなに報告する。

元々はライフコーチさんがチームメイトの寝坊問題に対して出した提案です。

それをアウトプットの時に聞いて「これだ!!」ってなったんですよね。

ライフコーチさんに速攻相談して内容を決め、その日の夜から始めました。

1.朝5時前に起きる

まんまですね。

ただ、早起きするとみんなより早く起きたってちょっと優越感(笑)

せっかく早く起きたんだから、何かしなきゃって貧乏性も手伝って何かします(笑)

2.散歩に30分、筋トレ・ストレッチに30分

ずっと机にかじりついてて体が鈍って仕方がなかったので、その対策です。

YouTubeのブライトサイドって番組の中から10分程度で出来るモノを探しました。

3.タイピングアプリ(e-typing)を朝・夕に最低5回ずつ

プログラムの記述をする際のタイピングが遅すぎ問題への対策ですね。

ライフコーチさんからは「寿司打」をお勧めされましたが

やってみたら、こちらが自分には合ってました。

最終的には寿司打も始めちゃいました。

4.日々の学習時間とは別に朝夕1時間ずつ学習時間を持つ

早めに起きる事で朝に時間ができ、その分を学習時間に当ててみました。

基本的には前日出題されたドリル問題の内容をちょっといじって解く

を繰り返していました。自分でいじったくせにエラーが出て慌ててました。

5.1〜4を毎日スラックでみんなに報告する。

こちらもまんまですね。

やるからには恥だろうが曝け出さないと!

と言う事で平日は必ずあげてました。チームの方はご存知ですね〜。

さぞ、煩かった事だと思います。

だって、朝5時に毎日上げてるんのだもの・・・。

見守ってくれて、ありがとうございます!

実は、今もず〜っとやっていて

卒業後はキャリアアドバイザーさんにお願いして毎日スラックあげてました

タイピングはEランクから始まって、今ではAランクが出せるようになりました。

ただ、気を抜くとBランクに下がるので、油断できない・・・。

学習時間はRuby&railsもしてますが、htmlとcssがメインになりつつある・・・。

プラス、Pythonを本格的に始めました。

メンターさんへの質問フォーマットが変わる

前述してはいますが「応用」になって一番変わった事がここですね。

「応用」に入って即注意を促されました。

加えて、「応用」に進んだ事で、エラーの赤い画面が身近なものになりました。

  1. 何故エラーが出たのか自分で考える(MVCの関連性で見てみる)
  2. 対策として記述を変更してみる
  3. 変更した結果何か変化はあったのか

この3つの記述がメンターさんへの質問前に必要となりました。

ただ、私の場合はそのほとんどが

タイピング下手によるスペルミスだったんですよね。

自分でどう言う記述したのかもあんまり覚えていなくせに

自分の記述は間違っていないはずって言う無駄な自信はあって

しかも、エラー画面の見方が分からないから

「お前は何を言ってるんだ??」状態なんです。

先ず行ったのは英語わからんからGoogle翻訳先生にコピペで貼り付けるでした。

後にメンターさんから、

VSCode(プログラムの記述をするアプリ)の検索機能を教えてもらい

応用でのエラーは、時間はかかりますがだいたい解けるようになりました。

岩田さんの言葉を思い出した。

私の尊敬する、目標としている人の一人に、

任天堂代表取締役社長の岩田聡さんがいまして

岩田さんの言葉を集めた本があるのです。

その中に、こんな言葉があります。

 

プログラムは純然たる、純粋なロジック。

そこに一つでも矛盾があったら、そのシステムは動かない。

機械の中で間違いは起こらない、間違いは全て機械の外にある。

システムが動かないとしたら、それは明らかに自分のせい。

 

この時期、毎回寝る前に岩田さんの本を読んでいた気がします。

10月上旬:「最終課題」

自らコードを書く大変さを知る

最終課題の特徴

ついに最終課題になりました。

学習スケジュール的には4日分ほど先行して余裕があるため楽勝だろう

とか思っていました。

が、今までは

記述の見本がある。

もしくは、問題を出されても回答で答え合わせができる。

と言う状況から一転。

自身でコードを記述するが、答えの記載はない。

ちゃんと動けばそれが正解。それが答え。

と言う状態に。

もちろん、最終的にはメンターさんにコードを見てもらって

ちゃんとしたものになっているか判断はしてもらいますが

あくまで、「判断」であり、責任は記述した自分に全てあります。

記述する内容の印象は大まかに分けて

  • サーバーサイド(お客様が起こす行動に対しての反応を行う)の記述:7
  • 非同期(アニメーションなど)の記述:2
  • ビュー(お客様が見る画面)の調整記述:1

と言った感じでした。

今までの教材の中に全てヒントはありますし、

実装までの流れもおさらいできます。(あくまでヒントとして)

それに、ビュー(お客様が見る画面)に関してはある程度用意されているので

それらから自分で探して(予想して)コードを書かないといけなくなりました。

今まで以上にエラーの赤い画面が頻発します。

前述の「岩田さんの言葉」を思い出しながら記述を進めます。

記述していく上で気をつけたのは以下の部分ですね。

  1. 作業工程を細かく区切ってコミット(セーブポイント作る)を行う
  2. メンター(先生)さんは内容の理解が正しいか確認するために伺う
  3. アウトプット時間を有効活用する
注意点1.作業工程を細かく区切ってコミットを行う

最終課題の記述を進めていく上では

実際の企業様のように大人数でアプリを作成していくような想定で

いろいろなアプリを使います。

その中の一つにGitHubと言うアプリがありまして

このアプリがすごく便利で、機能の一つにコミットと言うものがあります。

ゲームとかのセーブポイントを作るような機能で、細かく作業を区切って

正しくかけたらコミットして先に進む。

間違えていたら、一旦前のコミットまで戻る事もできる。

ありがたいことに、記述変更した部分がちゃんと確認できるので

失敗した場合、間違えている部分の当たりをつけやすく

エラー画面と見比べながら対応していく時にとても助かりました。

最終課題の完成までに、10個程度の機能を実装するのですが

一つの機能を実装するのに、20〜30箇所ぐらいコミット上げた気がします。

多いのかな?少なかったら、ごめんなさい。

 注意点2.メンター(先生)さんは内容の理解が正しいか確認するために伺う

「応用」「発展」を経てほんの少しですが

エラーに対しての対処法も分かり(間違いなく思い込み)ましたので

極力エラーに関しては自分で対処して

理解している内容に間違いがないのか確認するために

メンターさんへお伺いを立てる方法を取りました。

どうしてもわからなくて

答えを教えてもらう場面(日本語表記のスペースの数とか)もありましたが

大体自分でできたと思います。

これはチームメイトの存在が大きいですね。

チームメイトの方がそう宣言していて、ここは負けられないと言うか

その姿が純粋にかっこいいと思って真似しようと思ったんです。

チームメイトさん達の年齢は聞いていませんが、多分私が最年長なんですよね。

もっと言うと、ライフコーチさんもキャリアアドバイザーさんもメンターさんも

関わる方皆さん年齢は下なんです。

なのに、失礼なんですが皆さんしっかりしている。

私の考え方が霞むくらいに深く考えてらっしゃる。

なら、見習わないと損じゃないですか!

大袈裟じゃなく、

テックキャンプのスタッフの方達やチームメイトの皆さんに会えた事、

話を出来たことが受講で得られた1番の宝ですね。

3.アウトプット時間を有効活用する

最終課題から、アウトプットの時間が変更になりました。

約1時間ごとから、約2時間ごとに1回のペースです。

正直ここが一番辛かった。

チームメイトのアウトプットってヒントが多いのですよ。

作業内容のヒントや理解の補填ができるし、

共に実装が終わった箇所の記述を見せてもらったりすると、

その人の癖とかもなんとなく分かります。

私のネーミングセンスが壊滅的だと言う事もバレているでしょう・・・。

そのアウトプットの時間削るって・・・。

で、悔しかったので、チームメイトとライフコーチさんの了承を得て

土日のどちらかに、アウトプット大会(仮)を開催させていただくように提案しました。

こちらも、いまだに継続できていて

後述するオリジナルアプリの実装内容と期限を宣言したり

就職活動の進捗とかポイントとかを共有したりして

有意義な時間を過ごさせていただいています。

ありがとうございます!

10月中旬〜下旬:「オリジナルアプリ作成」〜卒業へ

最終課題へ追加実装を行う

4日分あった予備日も全て消えてしまいましたが

学習スケジュールの期日通りに最終課題の作成を終えることが出来ました。

ここからは、

  • 作成した「最終課題」の内容に追加記述を行うか
  • 自分だけの「オリジナルアプリ」を作成するか

の選択となります。

追加実装の内容は教材の中にヒントとして書かれており

「最終課題」を作っていく上で感じた、

何か不便だな〜とか感じた部分を補填するような内容でしたので

こちらを先に実行することにしました。

入力をミスった時の注意書きが英語で「???」だったことや

添付した画像が1日経つと仕様で消えちゃう問題とかですね。

こちらは、オリジナルアプリを作る際にもとても活用するので

先に練習できて良かったです。

「オリジナルアプリ」作成

白紙を渡される。

テックキャンプの学習期間も残り1週間。

やっとのことでオリジナルアプリ作成に取り掛かります。

そして、即戸惑います。

何作ろう

今までは、

「何故、このアプリを作るのか」と言う定義はもちろん

必要となる機能の洗い出しや、その機能の完成形。

作業期間までも大まかですが設定してくれていました。

今回はそれらがありません。全て自分で作成・設定せねばなりません。

メンターさんも不介入です。

当たり前ですね。

メンターさんもどう言う完成形を目指しているのか分かりませんから。

多分、エラーであればメンターさん達なら見れば分かるのでしょうけど

聞くのは違う気がするし、

エラーの対処法は今までで散々勉強できたのだから

その応用でなんとかなる。

てか、しないといけないと思います。

自転車で例えたら

  • 「最終課題」:補助輪外して自走できるようになるまでお手伝い。
  • 「オリジナルアプリ」:もう自走できるのだから好きなところに行きなさい。

こんな状態でしょうか。

こけたら、立ち上がればいいし

場所が分からないなら、地図を買うでもGoogleで調べればいい。

それだけのことです。

ただ、「発表する」と言う期日はあるので

残り1週間(正確には5日)と言うことを考えて

トップページだけ作成して、作ってます感だけは出す

と言う姑息な手段に出ました。

幸いトップページは2日程度で出来まして後は前述の

  • 「何故、このアプリを作るのか」と言う定義
  • 必要となる機能の洗い出しと、その機能の完成形
  • それぞれの作業期間の設定

と言う、考える時間に残りは費やしました。

個人的には

最低限、地図を持っていないとどこにもいけないと思っていましたので

この考え方で良かったのではないかなと思っていました。

一応ライフコーチさんに話して了承も得ていましたのでOKでしょう(笑)

最終課題仮発表

みんなすげえ

いよいよ最終日、「最終課題」「オリジナルアプリ」の発表会です。

の前の(仮)発表会です。

進捗状況とかは聞いていましたが

初めてチームメイトさん達のオリジナルアプリを拝見できます。

毎回次の期の方達の前で仮で発表を行い

その後、感想を含めて本番の発表を行うようです。

と言うことで先ずは85期の方達の前で仮発表なのですが、見た時焦りましたね。

完成度高え。

私のなんちゃってトップページとは訳が違う・・・。

83期の方達の仮発表を見た時も思ったのですが、

しっかりと計画を立て筋道を吟味していると後は進むだけなので

実装までの時間が短縮できるのと同時に完成度も上がるのだと思います。

私の発表の時は、ただただ、恥ずかしかったです。

でも、考え方は間違えていなかったとも思いました。

最終課題本発表

これで本当に最後!

チームメイトの皆さんの2ヶ月半の内容集大成!

皆さんの感想を聞けたことがありがたかったですね〜。

欠員もなくみんな揃って卒業できた事も嬉しかったです。

卒業といっても明日からは就職活動が始まるわけで

気は抜けない日々が続くのですが・・・。

発表会後のお酒はとっても美味しかったです。

そしてもれなく、次の日二日酔いでした。

 

後半へ続く

 

【Rails】ソート機能を作ってみる

今回はindex画面にソート機能をつけてみたいと思います!

完成予想図はこんな感じです。

gyazo.com

実装にあたり、解らないところが噴出しましたのでそちらも一つ一つ調べて行きます。

目次

1.前提条件

1-1.モデル

先ずはモデルですね。こんなテーブルを用意しました。

class CreateStocks < ActiveRecord::Migration[6.0]
def change
create_table :stocks do |t|
 
t.string :publisher, comment: '出版社名'
t.string :magazine_name, comment: '雑誌名'
t.integer :num, comment: '冊数'
t.integer :price, comment: '本体価格'
t.string :i_form, comment: '発行形態'
t.string :purchased, comment: '買切雑誌'
t.references :calendar, null: false, foreign_key: true
t.timestamps
end
end
end

1-2.コントローラー

class StocksController < ApplicationController

def index
@calendar = Calendar.find(params[:calendar_id])
@stocks = @calendar.stocks
end

end

1-3.ビュー

<table>
<thead>
<tr>
<th>陳列</th>
<th>出版社名</th>
<th>雑誌名</th>
<th>冊数</th>
<th>本体価格</th>
<th>発行形態</th>
<th>買切雑誌</th>
 
</tr>
</thead>
<tbody>
<% @stocks.each do |stock| %>
<% if stock.num > 0 %>
 
 
<tr>
<td><%= stock.display %></td>
<td><%= stock.publisher %></td>
<td><%= stock.magazine_name %></td>
<td><%= stock.num %></td>
<td><%= stock.price.to_s(:delimited) %></td>
<td><%= stock.i_form %></td>
<td><%= stock.purchased %></td>
 
</tr>
<% end %>
<% end %>
</tbody>
</table>
</div>
</div>

特出した内容ではありません。

今回の実装に関係ないところは省略しています。

さあ実装です!

2.コントローラー

先ずはコントローラーに必要な処理を記述して行きます。

完成形はこんな感じです。

class StocksController < ApplicationController
# ここを追記
helper_method :sort_column, :sort_direction

def index
@calendar = Calendar.find(params[:calendar_id])
# order以降を追記
@stocks = @calendar.stocks.order("#{sort_column} #{sort_direction}")
end
# private以下を追記
private

def sort_direction
%w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'
end

def sort_column
Stock.column_names.include?(params[:sort]) ? params[:sort] : 'id'
end

end

helper_method :sort_column, :sort_direction

privateメソッドとして定義している「sort_direction」と「sort_column」を

viewからも使えるようにするため、helper_methodに追加しています。

sort_directionメソッド

「%w[asc desc].include?(params[:direction]) ? params[:direction] : 'asc'」

と言う記述が、もう訳がわからんのですが、一つずつ調べてみました。

%w[asc desc]

asc(:昇順)desc(:降順)で、ここは解るのですが、%wがなんじゃらほい。

どうやら、「%記法」と言うものらしいです。

%記法とは

%記法の本来の目的は、

文字列に含まれる「’ ‘」や「” “」を「( )」などの非英数字に置き換えて、

「’ ‘」や「” “」に対するエスケープを省略するために利用するのだそうです。

例えば、次の構文は全て同じ処理結果になります。

  • “\“abc\””
  • %(“abc”)
  • %!”abc”!
  • %?”abc”?
  • %+”abc”+

可読性をよくすることは、バグ発生の減少に繋がります!

そして、%wや%Wは配列の作成に特化してコーディングが楽になるように設計された、

%記法の延長上にあるRuby構文でした!

%w記法(配列)

%w記法は、文字列からなる配列を作成したいときに

「[ ]」(ブラケット)や「" "」(ダブルクォーテーション)を省略して記述するための

Rubyの構文です。

%w(文字列1 文字列2 文字列3...)

こんな感じで記述します。

文字列間の空白が区切る意味になります。

%w記法を使うと、プログラムコードの可読性がよくなって、

記述もカンタンになるので、よく利用される書き方なのだそうです!

%w記法を使わない場合と使う場合のコードの違いを比較して、

どのように可読性がよくなるかを確認して見ましょう。

%w記法を使わない場合(スクールで習っていた内容):

puts ["Qiita", "ブログ", "Ruby", "\"%w記法\""]

%w記法を使う場合:

puts %w(Qiita ブログ Ruby "%w記法")

だいぶわかりやすい!特に%w記法のところ!

実行結果はどちらも同じでした。

Qiita
ブログ
"%w記法"

と、言う事で、

%w[asc desc]は、『asc』と『desc』と言う文字の配列と言う意味でした。

%wと%Wの違い

これは余談ですが、%wと%Wがあるらしく、

こちらの違いがちょっと面白かったので記載します。

%W記法は、%wと同様で空白区切りの文字列から配列を作成できますが

  • %W → 式展開あり
  • %w → 式展開なし

チョットナニイッテルカワカラナイ・・・ぶ、VSCode君お願い・・・。

%Wの場合は

blog = "ブログ"
puts %W(Qiita #{blog})

結果は・・・

Qiita
ブログ

%wだと

blog = "ブログ"
puts %w(Qiita #{blog})

結果は・・・

Qiita
#{blog}

ふむふむ。ちゃんと代入した結果を表示してくれるって訳ですね!便利!!

include?(params[:direction])

「配列.include?(値)」で、配列の中に値と同じものがあった場合

「true」を返します。

例題:

a = [ "a", "b", "c" ]
puts a.include?("b")
puts a.include?("z")

結果は

true
false

と言うわけで、『%w[asc desc].include?(params[:direction])』の記述は

パラムスの中に入っている「direction」がasc かdescのどちらか調べてね。

と言う事ですね。

「direction」が何を指すのかは後述します。

? params[:direction] : 'asc'

この、『?』から記述を三項演算子と言うのだそうです。

三項演算子

条件分岐を行うための演算子って事なのですがぶっちゃけ良くわからない・・・。

条件式 ? 真の時の値 : 偽の時の値

条件式を判定して、

trueだった時は「真の時の値」を、

alseだった時は「偽の時の値」を返します。
条件や返り値がシンプルな場合、if分よりも簡潔に記述できる優れもの!

(結論)sort_directionメソッドの意味

上記の長々とした解説の内容は

パラムスの中に入っている「direction」がasc かdescのどちらか調べて

ascかdescだったらそのままその値を、どちらでもない時はascを返してね。

もっと言うとページへ遷移した直後はdirectionの中は何も決まっていないので

初期値はasc(昇順)にしてね

と言う意味でした。説明長いな!!

 sort_columnメソッドの解説

Stock.column_names.include?(params[:sort]) ? params[:sort] : 'id'

こちらも条件式と三行演算子の組み合わせです。

三行演算子は上記をご確認いただくとして「column_names」って何やねん。

column_names

column_namesは「モデル名.column_names」と記述する事で

モデルで設定されているカラム名を調べてくれるメソッドです。

試しに、VSCode君で確認してみます。

rails runner 'puts Stock.column_names'

結果は

Running via Spring preloader in process 90223
id
 
display
publisher
magazine_name
num
price
 
i_form
 
purchased
calendar_id
created_at
updated_at

ちなみに、

rails runner 'p Stock.column_names'

と記述すると

Running via Spring preloader in process 90259
["id",〜〜省略〜〜 , "updated_at"]

と言った様な配列の記述で返してくれますのでお好みでどうぞ。

rails runner

おまけですが、rails runnerは任意のrubyコードが実行できるコマンドです。

Active Recordも使えるのでbatch処理のときに使えます

(結論)sort_columnメソッドの意味

Stock.column_names.include?(params[:sort])と言う条件式で

パラムスの中にある「sort」が、stockモデル内のカラム名と一致するかを判別して

一致するものがあればそのままsortを返して、なければ「id」を返す。

ページへ遷移した直後は「sort」の中は何も決まっていないので

初期値はid(Stockモデルのid)にしてね

と言う意味でした。

indexメソッドの解説

indexメソッドは

@stocks = @calendar.stocks.order("#{sort_column} #{sort_direction}")

と、「.stocks.order("#{sort_column} #{sort_direction}")」を追記しています。

例えば、ソートが作成された時期の昇順であれば

@stocks = @calendar.stocks.order("created_at asc")

と表記します。こちらの応用ですね。

  • ソートするカラムは#{sort_column}で、ページ遷移直後(初期値)は「id」
  • 順序は#{sort_direction}で、ページ遷移直後(初期値)は「asc」

と、なります。

ふう〜、コントローラーだけでわからない事だらけです。

3.ヘルパーメソッド

お次は毎度勉強になるヘルパーメソッドです。

module StocksHelper
def sort_order(column, title)
direction = (column == sort_column && sort_direction == 'asc') ? 'desc' : 'asc'
link_to title, { sort: column, direction: direction }
end
end

 上記の様に記述します。

こちらもわからないことがあったので一つずつ調べて行きます。

sort_orderメソッド

まず、sort_oderメソッドは二つ引数を指定しています。

  • 第1引数(column)は並び替え元となるデータベース上のテーブルのカラム名
  • 第2引数(title)はViewに表示するカラム名です。
directionの説明

sort_directionメソッドで出てきた「direction」ですね。

三行演算子で返ってきた値が「direction」です。返す値の定義は

「(column == sort_column && sort_direction == 'asc') ? 'desc' : 'asc'」

で、

モデルのカラム名とsort_colimnの値が同じで

かつ(&&)、sort_directionの値がascだった時は「desc」を返してね。

違う時は「asc」を返してね。

要は、

そのカラムのasc(昇順)が選ばれたらdesc(降順)に。

desc(降順)が選ばれたらasc(昇順)にしてね。と言うことになります。

こちらが下の行に記述している「link_to」 にかかってきます。

link_toは、次にクリックされるときのソートの方向をパラメータに設定した

リンクを作るため、上記の様な逆のdirectionになっています。

4.ビューを編集

Helperに作ったsort_orderを<th>に追加します。

長くなりそうなので、修正を行った<thead>の部分のみです。

<thead>
<tr>
<th><%= sort_order "display", "陳列" %></th>
<th><%= sort_order "publisher", "出版社名" %></th>
<th><%= sort_order "magazine_name", "雑誌名" %></th>
<th><%= sort_order "num", "冊数" %></th>
<th><%= sort_order "price", "本体価格" %></th>
<th><%= sort_order "i_form", "発行形態" %></th>
<th><%= sort_order "purchased", "買切雑誌" %></th>
 
</tr>
</thead>

表示されている各カラムでソートできる様にしてみました。

やった!出来た〜!!

5.課題は山積みと感謝

お疲れ様でした!

初めての事ばかりなので、調べては試しにやってみるの繰り返し

ブログに書くからには出来るだけ分かりやすく丁寧にとも思い

そこでさらに調べる。結果さらに遅くなるを繰り返しています(笑)

これで終わりではなくて、課題は山積み。最低でも

  • まだ実装していない検索結果機能を結び付けたい
  • 何でソートしているのか、色をつけるなりして可視化したい

こんな機能はつけたいな〜と考えています。

てか、ブログもきちんと正確に、かつ読みやすく試行錯誤してますが

実際どうなのだろう・・・。

ともあれ、先人の方達の遺産を拝見しながら

少しづつでもステップアップして行きたいなと考えております!

ありがとうございます!!

統合ターミナルありがとう!

毎度のことなのですが、ちゃんと動くか下調べって大事ですよね。

そんな時に大活躍するのがVSCode君の統合ターミナル様です!

control + shift(Macでは^マーク) + `で降臨いただけます。 

教えてくれたスクールのチームメイトさんに大感謝です!ありがとー!

参考にさせて頂いたサイト様

【Ruby入門】%記法の使い方まとめ|%w・%W・%q・%r・%i・%I… | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト

Array#include? (Ruby 2.7.0 リファレンスマニュアル)

[Rails] ソート機能をつくる|ota|note

感謝!!

【Rails】ネストされた、子要素にCSVインポート機能を実装してみる。

今回は、CSVファイルのインポート(一括入力)処理を作っていきます。

スクールのカリキュラムに載っていない内容なので

書く前からそわそわしております・・・。

間違っていたら、優しく教えていただけるとありがたいです。

おぢさんのメンタルはやわらか戦車よりやわらかいので・・・。

と言う事で、最終的な完成形の流れはこんな感じです。

  • 1.最初は、親のcalendaer(入荷日)を決めます。

gyazo.com

  • 2.親のcalendaer(入荷日)に関連する入荷物をCSVファイルから一括入力します。

gyazo.com

すると、入荷物を一括で見る事ができます。

gyazo.com

目次

 

1.前提条件

1-1.モデル

親(calender)

class Calendar < ApplicationRecord
has_many :stocks, dependent: :destroy

 
end

わかりやすくする為、バリデーションは省いています。

マイグレーションは割愛します。

ポイントは

  • アソシエーションを記述して、stockモデルとの親子関係を定義
  • 「dependent: :destroy」を記述して、親を削除すると関連する子のデータも消す

子(stock)

class Stock < ApplicationRecord
belongs_to :calendar

 
 
 
end

こちらのマイグレーションは今はここまで。

後で修正をかけるのですが、現時点では割愛します。

ポイントは

  • アソシエーションを記述して、stockモデルとの親子関係を定義
1-2.ルーティング
Rails.application.routes.draw do
resources :calendars do
resources :stocks
end
end

ネストは、ある記述の中に別の記述をして、親子関係を示す方法です。

入れ子構造」とも呼ばれますね。

と言う事で、calenderコントローラーのルーティングの中に、stockコントローラーのルーティングを記述しています。

1-3.コントローラー

こちらは、実装の主役であるstockコントローラーだけです。

class StocksController < ApplicationController
def index
@calendar = Calendar.find(params[:calendar_id])
@stocks = @calendar.stocks
end

 
end

今のところ、定義するのはindexだけですね。

親(calender)のデータと

付随する子(stock)のデータを全て出力します。

1-4.ビュー

こちらも、今回の主役stock/index.html.erbだけ。

〜省略〜
 
<table>
<thead>
<tr>
<th>陳列</th>
<th>出版社名</th>
<th>雑誌名</th>
<th>冊数</th>
<th>本体価格</th>
<th>発行形態</th>
<th>買切雑誌</th>
</tr>
</thead>
<tbody>
<% @stocks.each do |stock| %>
 
<tr>
<td><%= stock.display %></td>
<td><%= stock.publisher %></td>
<td><%= stock.magazine_name %></td>
<td><%= stock.num %></td>
<td><%= stock.price.to_s(:delimited) %></td>
<td><%= stock.i_form %></td>
<td><%= stock.purchased %></td>
 
</tr>
<% end %>
</tbody>
</table>

大事なところだけ抜き出しています。

登録したデータをエクセルの様な感じで表示してくれます。

csvのファイルデータは他にもっとあるのですが、

画面に表示するのは7項目だけって事ですね。

1-5.テーブル(表)タグの説明

<table>はテーブル(表)を作成するタグですね。

テーブル(表)の基本的な構造としては

<table>~</table>内に<tr>〜</tr>で表の横一行を定義して

さらにその中に<th>〜</th>や<td>〜</td>でセルを定義したりします。

テーブル(表)の各セルには

見出しを定義するヘッダセル(<th>〜</th>)と、

データを定義するデータセル(<td>〜</td>)があります。

ヘッダセル内のテキストは、一般的な画面では太字で中央に表示されるみたいです。

後は、スタイルシートで装飾してあげます。

2.課題は山積み

今回の実装をするにあたり、解決しないといけない事が結構ありまして

先ずはそちらを書き出していきます。

  • CSVファイルを読み込む記述をする。
  • CSVファイルのヘッダー(カラム名)が日本語だった。
  • CSVファイルを読み込む際、親のidをどうやって入れよう。

大きくはこの3点です。

あ〜でもない、こ〜でもないと苦悩の日々が始まります。

3.CSVファイルを読み込む準備

先ずはCSVファイルなどを読み込む事ができるGem「Roo」を読み込みます。

3-1.Gem「roo」

「Roo」は、スプレッドシートタイプの読み取りアクセスができるライブラリで

今回はCSVを読み取るために使わせていただきます。

他にも

などが処理できる様です。すごい便利!

ライブラリをGemfileに追加し、bundle installしちゃいましょう。

gem 'roo'
3-2.CSVファイルを確認

今回使うCSVファイルを用意します。


書店コード,地区名,書店名, 〜省略〜,ISBNコード,
123456,テスト,テスト,〜省略〜, ,
123456,テスト,テスト,〜省略〜, ,
123456,テスト,テスト,〜省略〜, ,

めっちゃ項目が多いので省略しまくりました。

ポイントとしては、ヘッダーが日本語表記だと言う事ですね。

3-3.マイグレーションを記述

CSVファイルの内容に合わせてマイグレーショを記述していきます。

class CreateStocks < ActiveRecord::Migration[6.0]
def change
create_table :stocks do |t|
t.string :store_code, comment: '書店コード'
t.string :district, comment: '地区名'
t.string :store_name, comment: '書店名'
〜〜省略〜〜
 
t.string :isbn, comment: 'ISBNコード'
t.references :calendar, null: false, foreign_key: true
t.timestamps
end
end
end

 

4.importアクションを設定(ルーティングの記述変更 )

config/routes.rbに下の様に記述を追加します。

Rails.application.routes.draw do
resources :calendars do
resources :stocks do
下記一行を追加
collection { post :import }
end
end
end

 これで、

gyazo.com

この様に、importアクションが追加されました。

5.ビューを実装(フォームを作成)

5-1.コントローラーを記述追加

今回は、「new」画面でフォームを作成したかったので

「newアクション」を先に記述追加します。

class StocksController < ApplicationController
def index
@calendar = Calendar.find(params[:calendar_id])
@stocks = @calendar.stocks
end

def new
@calendar = Calendar.find(params[:calendar_id])
end

 
end

ポイントは親のidを忘れずに持ってくるぐらいですかね。

5-2.ビュー作成。

そして、ビューですがこんな感じです。

<%= form_with url: import_calendar_stocks_path do |f| %>
<h3>CSVファイルを入力してください</h3>
<%= f.label :入荷物%>
<%= f.file_field :file, accept: '.csv' %>
<%= f.submit "登録"%>
 
<% end %>

ポイントは3つ。

  1. 「form_with」を使うといろいろ省略できて便利。
  2. 「method: :get」をつけない。
  3. 「accept: '.csv'」 を記述する。

順に説明しますと

補足説明1.form_with」を使うといろいろ省略できて便利。

csvインポートを実装したくて、Qiitaや各ブログを拝見していましたら

多くの方が

<% form_tag import_books_path, multipart: true do %>
<%= file_field_tag :file %>
<%= submit_tag "インポート"%>

と、言う様な記述をされていたのですよね。

この「multipart(マルチパート)」は

画像やCSVなどのファイルを読み込む際に必要になってくる記述なのですが

form_withを使う場合は省略可能で、

form_with内にfile_fieldが存在すれば自動的にmultipartが適用されちゃうそうです!

便利な世の中になったもんだ・・・。

これは、Rails 5からだそうです。

カリキュラムでは何も知らずに使っていましたがバージョンアップってすごい!

補足説明2.「method: :get」をつけない。

getリクエスト(form_withにmethod: :getを指定する)にしてしまうと

パラメータがnilになっちゃうらしくでデフォルトのpostのままにします。

補足説明3.「accept: '.csv'」 を記述する。

「file_field」に「 accept: '.csv'」 を書くことで、

csvファイルだけが選択される様になります。

(ファイル選択時、csvファイル以外は非活性状態になってます)

 6.CSVインポート作業を実装

も〜、ここで1週間ぐらい悩みました。

自分なりに出した結論は以下の様な感じです。先ずはコントローラーから

6-1.importアクションを記述

長くなりそうなので、インポートアクションのみ記述します。

def import
@calendar = Calendar.find(params[:calendar_id])
Stock.import(params[:file], params[:calendar_id])
redirect_to root_path, notice: "#{l @calendar.day, format: :long}の入荷物を登録しました。"
end 

ポイントは記述順に

  • 親のデータを取得しておく
  • importで送られるデータはcsvのファイルと親のidにしておく。
  • ちゃんと登録できたか、確認のためにフラッシュも付けておく。
6-2.モデルに記述追加

こちらも長くなりそうなので所々省略します。

class Stock < ApplicationRecord
belongs_to :calendar

def self.import(file, calendar)
CSV.foreach(file.path, headers: true) do |row|
stock = find_by(id: row['id']) || new
row_hash = row.to_hash.slice(*CSV_HEADER.keys)
stock.attributes = row_hash.transform_keys(&CSV_HEADER.method(:))
stock['calendar_id'] = calendar
stock.save
end
end

CSV_HEADER = {
'書店コード' => 'store_code',
'地区名' => 'district',
'書店名' => 'store_name',
〜〜省略〜〜
 
'ISBNコード' => 'isbn',
}.freeze
end

複雑な作業をコントローラーでさせる訳にはいかないので、モデルに記述します。

モジュールに書き出して呼び出すと言う方法もある様です。

ポイントは3つ

  • ヘッダーが日本語問題対策
  • CSV.foreachのオプションで指定しているもの
  • 親のidを別途登録

順に説明していきます。

補足説明6-1.ヘッダーが日本語問題対策

ヘッダーが日本語なので、そのままだとattributesに入れる事ができない・・・

まあ、ぶっちゃけマイグレーションを日本語のカラム名にして

csvファイルをそのまま取り込むことはできました。

ただし、localhos上だけですが。

(試していないのですがheroku上でも大丈夫なのではないでしょうか。)

ただ、ここで楽をしてしまうと、成長止まるかなとも思いチャレンジです。

ヘッダーの項目名とテーブルのカラム名のハッシュを

CSV_HEADER」として定義しておいて、

「transform_keys」でカラム名に一致するように入れ替えます。

これで、modelのattributesに対応します。

補足説明 6-2.各記述の説明

「CSVforeach」で一行ずつ解析していくのですが

headers: true:ヘッダーを読み飛ばしてくれます!

stock = find_by(id: row['id']) || new

今回のCSVファイルにはIDの表記がないので

もし合った場合はそのレコードを呼び出し、ない場合は新しく作成。

row_hash = row.to_hash.slice(*CSV_HEADER.keys)
stock.attributes = row_hash.transform_keys(&CSV_HEADER.method(:))

CSV_HEADERを基にして、hashに変換する。

stock['calendar_id'] = calendar

最後に、親のidを追加

ふ〜・・・。やっとできました!

7.残る課題

やっとこさ出来上がってはみたのですが

記述方法が悪いのかなんだか取り込みスピードが遅い気がするのですよね。

herokuだともっと遅い気がします。

この辺を勉強して、早く処理できる様になったらまたブログにします!

8.参考にさせていただいたサイト様

[Rails6]CSVインポート処理を作る|ota|note

【Rails】CSVインポート機能の実装 - Qiita

どちらの方にも足向けて眠れません。

自分なりの解釈も入れてはいますがほぼ上記の方々の書かれているとおりです。

少しづつでも理解して行って、どなたかの助けになっていたらいいな〜。

 

【Rails】ネストされた子要素の新規作成・一覧表示・編集作業を考える。

スクールでネスト(入子構造)に関して学んだ事は

新規作成(new,create)ぐらいで、実際は詳細や編集、削除だってするだろうし

そんな時ってどうするんだろう。

と言う訳で、今回はそんな苦悩のお話です。

ぶっちゃけ、すっごい初歩的な事で自分の恥を晒す様でむず痒いのですが

初心者なんてこんなもんと開き直って書いていきます。

目次

1. 前提条件

customer(お客様:親)モデルと、product(商品:子)の二つのモデルを作ります。

先ずはモデルです。こちらは親モデルのcustomer

class Customer < ApplicationRecord
has_many :products, dependent: :destroy

 
end

こちらは、子モデルのproduct

class Product < ApplicationRecord
belongs_to :customer

 
end

バリデーションとかは省略しています。

ポイントは「dependent: :destroy」でしょうか。

親モデルのcustomerを削除すると関連するprodcutも消してくれます。

マイグレーションは割愛してお次はルーティングです。

Rails.application.routes.draw do
resources :customers do
resources :products
 
end
 
end

ポイントは

ルーティングのネストですね。

customerコントローラーのルーティングの中に、

prodcutコントローラーのルーティングを記述しています。

ターミナルにて「rails routes」で状態確認。

gyazo.com

よしよし、ちゃんと親子関係になってる。嬉しい。

お次のコントローラーは後述するので飛ばします。

最後はビューですね。

<div class='account-page' id='account-page'>
<div class='account-page__inner clearfix'>
<div class='account-page__inner--left account-page__header'>
<h2> Index Products</h2>
<h5><%=@customer.name%>様の取置商品一覧</h5>

</div>
<div class='account-page__inner--right'>
<div >
<ul>
<% @products.each do |product| %>
<li>
<div class='customer_index_list'>
<div class='customer_index_list_header'>
定期 : <%= product.name%>
</div>
<div class='customer_index_list_footer'>
<div class='customer_index_list_footer_left'>
取置冊数:<%= product.num %>
</div>
<div class='customer_index_list_footer_right'>
登録日:<%= l product.created_at %>
</div>
</div>
</div>
</li>
<% end %>
</ul>
</div>
</div>
</div>
</div>

CSSをいじって最終的な見た目はこんな感じにしたいな〜。

gyazo.com

それにしても前置き長いですね。ごめんなさい。

ただ、今まで他の方のブログや、キータを拝見させていただいて

私が不勉強なばっかりに解らないことが多かったので、

出来る限り前提条件とかそう言うものも含めて記載した方が、

イメージしやすいのかなと思いまして長々と書いております。

2.「new」「create」のコントローラーとビューを考える。

2-1.newとcreateアクション

モデルとテーブルは前提条件で作り終えたので

先ずは新規登録と一覧表示のアクション内容・遷移先の記述をしていきます。

アクションはこんな感じです。

class ProductsController < ApplicationController
def index
@customer = Customer.find(params[:customer_id])
@products = @customer.products.all.order('created_at DESC')
end

def new
@customer = Customer.find(params[:customer_id])
@product = Product.new
end

def create
@customer = Customer.find(params[:customer_id])
@product = @customer.products.new(product_params)
if @product.save
redirect_to edit_customer_path(@customer), notice: "#{@customer.name}様の取置商品を登録しました。"
else
render :new
end
end

 
private

def product_params
params.require(:product).permit(:name, :z_code, :num, :release).merge(customer_id: @customer.id)
end
end

新規登録画面を作成し、そちらで登録作業を行うことにしたので

「index」「new」アクションを定義します。

  • 親であるcustomerのidはパラムスの中に入っているのでこちらを取り出します。

「create」アクションでは

  • 「@customer.product.new(product_params)」とすることで、どの顧客(@customer)に対しての商品(product)を作るのか指定しています。
  • ストロングパラメーターも利用します。渡されたparamsの中にproductというハッシュがある二重構造になっているので、requireメソッドの引数に指定して各カラムを取り出しcustomer_idカラムには、親のidとなる@customer.idをmerageでくっつけます。
2-2.「notice」と「alert

あんまり関係ないのですが、補足説明として。

「notice:」は直訳すると通知と言う意味で、保存が成功したらフラッシュで成功した事を教えてくれます。

本来であれば下記が正解らしいのですが、

def create
@customer = Customer.find(params[:customer_id])
@product = @customer.products.new(product_params)
if @product.save
flash[:notice] = "#{@customer.name}様の取置商品を登録しました。"
redirect_to edit_customer_path(@customer)
else
render :new
end
end

こちらの短縮系ですね。ちょっとスッキリです。挙動に違いはありません。

反対の「:alert」もあるのですが、

バリデーションでのエラーメッセージを返す様にしているのでこちらは省略。

ちなみに、保存に成功すると

gyazo.com

こんな感じでお知らせしてくれます。

個人的に、Sequel Proで確認しないと落ち着かないので

付けてる意味あるのかって話ですが、多分意味はあるはず・・・。

2-3.遷移先の記述。

 コントローラーは終わったので、お次はビューですね。

今回は、親(customer)の編集画面から子(product)の登録画面へ遷移する様にしています。

app/vews/customers/edit.html.erbに

<h5><%=@customer.name%>様の情報を編集</h5>
<%= link_to "取置商品登録画面", new_customer_product_path(@customer), class: 'btn'%>
<%= link_to "取置商品一覧画面", customer_products_path(@customer), class: 'btn'%>
 

 ルーティングのパスに親の情報「@customer」を付けて渡しています。

 

3.「edit」と「update」のコントローラーとビューを考える。

いよいよ、正念場。

スクールのカリキュラムには例が載っていないところです。出来るのか、ワシ!

3-1.「edit」と「update」アクション
class ProductsController < ApplicationController

def edit
@customer = Customer.find(params[:customer_id])
@product = @customer.products.find(params[:id])
end

def update
@customer = Customer.find(params[:customer_id])
@product = @customer.products.find(params[:id])
if @product.update(product_params)
redirect_to root_path, notice: "#{@customer.name}様の取置商品を編集しました。"
else
render :edit
end
end


private

def product_params
params.require(:product).permit(:name, :z_code, :num, :release).merge(customer_id: @customer.id)
end
end

「new」と違って、既に作成された情報の変更を行うので

  • 「@customer = Customer.find(params[:customer_id])」で親の情報
  • 「@product = @customer.products.find(params[:id])」で親に関連づいた子供の情報

をそれぞれ定義しています。

3-2.遷移先の記述。間違いはどこでしょう。

ここで止まっちゃいました。

最初はapp/vews/products/index.html.erbに

 
<ul>
<% @products.each do |product| %>
<li>
<%= link_to edit_customer_product_path(@customer, @customer.products.ids), method: :get do %>
<%= product.name%>
<%= product.num %>
<%= l product.created_at %>
<% end %>
</li>
<% end %>
</ul>

って書いちゃったんですよね。

で、遷移もしてくれるのです。ただし、必ず同じ商品の情報編集画面へ。

これに気づかず出来たと勘違いして他の実装をしていたのです。

3〜4日経過して、他の件で商品情報を変更しようと思った時に

やらかした事に気づきました・・・

さて問題です。やらかした記述はどこでしょう。

3-3.答え合わせ。

正解は・・・

<ul>
<% @products.each do |product| %>
<li>
<div class='customer_index_list'>
<%= link_to edit_customer_product_path(@customer, product.id), method: :get do %>
<%= product.name%>
 
<%= product.num %>
 
<%= l product.created_at %>
 
<% end %>
</li>
<% end %>
</ul>

「@customer.products.ids」じゃなくて「product.id」でした!

まあ、ぶっちゃけそうですよね。

「@products.each do |product| 〜 end」の中にあるんだから。

URI Pattern」 にもそう書いてあるし。

gyazo.com

と言う訳で、無事に編集機能も実装する事が出来ました。

4.教訓

4-1今回の教訓は・・・。
  1. 落ち着け。
  2. よく見ろ。

ですかね。

CSVのインポート機能とか今までにした事ない機能を実装した後だったので

「通常の書き方と違ったりするの?」と一人でハラハラしていましたが

蓋を開けてみたら、ただの勘違いだったと。

4-2.プログラミングは面白い

変な話ですが、プログラミングって面白いですよね。

書き方一つ間違えると、もう、動かない。

誰が間違えている訳じゃない。自分自身の記述方法が間違えている。

他に責任を転嫁する事なく

「仮説」を立てて

「トライ&エラー」を繰り返し

「正解にたどり着く」

正解にたどり着いたときは嬉しいのなんの!

正直、歩みは遅いと思うのですが少しずつでも前に進んで行けたらなって思います!