つくりたいものに役立つかどうか考えながら学ぶと楽しい Day3/30
本日もRailsを学びました。
ProgateのRailsコース7を終わらせ、コース8に入る。162分。
何を学んだかをアウトプットするのではなく、ポートフォリオをつくることこそが技術を身につけるアウトプットだ、という意見を耳にします。
だから、素早くProgateを学び、Railsチュートリアルを通り抜け、ポートフォリオ作成に進みたいです。が、急げばことを仕損じる、という言葉もあるので、自分のペースでやっていきます。
学んだこと
・画像投稿機能の追加
まず、userのテーブルにユーザー画像を保存するためのカラムを追加するために、マイグレーションファイルを作成する。
データベースに直接書くのではなく、マイグレーションファイルにまず書いて、それをデータベースに反映させる、という二段構えでデータベースを書き換える。何か粗相があれば、直近のマイグレーションファイルを削除すれば元通り、というわけです。
マイグレーションファイルのなかには、changeメソッドがすでに記述されているので、そこに追加するカラム名とデータ型を記述する。画像データもPCからすれば、文字の集合なので、stingと記述する。なるほど。
既存のアカウント編集ページ(ビューであり、erbテンプレート)の<input>タグにtype属性のfileを追加する。すると、ブラウザ画面には「ファイルを選択する」ボタンが出現する。すごい! と単純に感心してしまう。
{multipart: true}を忘れないように。
画像データは、アクションで params で受け取る。受けとったデータを新変数 image に格納し、File クラスの binwrite メソッドで、ファイル名と内容を記述して public に保存する。binwrite メソッドで内容を読み取るときには、新変数 image に read メソッドを使う。
・ログイン機能の追加(途中)
上記とおなじ方法で、データベースにpasswordカラムを追加する。
session 変数という便利なものを学ぶ。格納した情報をブラウザに保存させることができる。この機能のおかげで、いわゆるログイン状態を保持しながらページを回遊できる、ということになる。
GoogleChromeが、パスワードを保存しますか? とポップアップさせてくるのはこの機能のようなものなのかもしれない、と感心する。
日常のなかの、ふとした瞬間の裏側を知った気分になり、すこし心地よくなります。
困難だったこと と 乗り越えたこと
・erbページの@のついていない変数の出現
アクションにて取得したデータ(変数)をerbテンプレートで利用するには、@user、というかたちでインスタンス変数を介してデータをやり取りします。
これはばっちし頭に入っていたのですが、あるerbテンプレートで@のついていない変数 user.image_name が機能していました。
なんじゃこれ、とよくよく見てみると、
そのページはユーザー一覧ページであり、見つけた変数の数行上には、
@user.each do |user| とありました。このメソッド内で使用されていたので、user.image_nameでよいのでした。
スコープ内ということをすっかり忘れていたということです。
・params[:image].read ってできないの?
フォームで入力した画像データを name属性 image でアクションに送信します。
画像データを保存するファイルを作成するときに、binwrite メソッドのなかで、parames[:image].readとせずに、新変数 image に params データを格納し、この新変数に read メソッドを使用することに違和感を覚えました。
params[:image].read でいいじゃないか? と。
これも調べた範囲での推測ですが、paramsはメソッドなので無理なのだと判断しました。
メソッドはオブジェクトに使用するものなので、メソッドにメソッドは使えないのではないか、というのが現状での理解です。間違ってるかもしれませんが、いまはこれで進みます。
うれしかったこと
画像投稿機能の流れを理解できました。つくりたいサービスには必須なので、こういうふうにやればいいのか、と思うことができました。
未知なる自分のプロダクトに必要なことを学んでいる、と感じられると進むのが楽しくなってきます。
もちろん、このあと、あるいはすでに、大きな落とし穴に落ちている可能性もありますが、、、。それはそれとして。
前進している感があると、よいですね。
このアウトプットもその流れを生み出しているひとつなので、明日もがんばろうと思います。
読んでくださったかた、ありがとうございます。
たわら
この記事が気に入ったらサポートをしてみませんか?