Torihaji's Growth Diary

Little by little, no hurry.

Rails7 form_withメソッド のあれこれ

はじめに

みなさん、こんにちは torihaziです。

今日は前回に引き続き自身の知識棚卸し回です。

2ヶ月前くらいの自分に説明するつもりで書いていきたいと思います。

どうぞ。

form_withについて

form_withとは Action_viewが持つヘルパーメソッドの1つです。

Action_viewとは Railsにおいてビューなどを処理するコンポーネントのことです。

ヘルパーメソッドは そのビューを作る上で便利であるメソッドのことでRailsがあらかじめ用意をしてくれています。

このfom_withメソッドを使用することによってhtmlにおける フォーム部分を生成することができます。

基本書式(いくつかある)

<%= form_with [宛先] [, オプション] do |ブロック|  %>
~~~
<% end %>

何も引数を与えずに実装すると form要素が作成されます。

私は今のところその用途に出会ったことがないので、宛先は必須としてもいいと思います。

また宛先については モデルインスタンスかルーティングヘルパーの2つのやり方を覚えておけばまず大丈夫だと思います。

ルーティングヘルパーのやり方(例)

<%= form_with url: posts_path do |f| %>
    <%= f.text_filed :title %>
<% end %>

モデルインスタンスのやり方 (例)

<%= form_with model: Post.new do |f| %>
   <%= f.text_field :title %>
<% end %>

モデルのやり方についてはコントローラで定義した内容によってものが違います。

例えばコントローラ側で@post = Post.newとした場合は 下記も可能です。

<%= form_with model: @post do |f| %>
   <%= f.text_field :title %>
<% end %>

上記で formを作成した場合、生成されるHTMLは次のようになります。

<form action="/posts" method="post">
  <input type="text" name="post[title]">
</form>

あとmodelのやり方をしたとき、与えるモデルインスタンス

どのような状態であるかによってformは変わります。

どのような状態とはどういうことかというとすでにデータが存在するかしない状態かということです。

例えば登録フォームではコントローラ側で下記のように指定するのが一般的です。

def new
    @post = Post.new
end

この時データはまだsaveメソッドを使っていないので DB上にありません。

これをnew.html.erbなどで呼び出して form_withで記載したとすると

<%= form_with model: @post do |f| %>
   <%= f.text_field :title %>
<% end %>

ちなみに更新フォームがあろうものならコントローラとビューは次のようになります。

def update
    @post = Post.find(params[:id])
end
<%= form_with model: @post do |f| %>
   <%= f.text_field :title %>
<% end %>

この時は すでにDB上にあります。

ここで登録フォームと更新フォームの書き方が同じですが、Railsは渡された@postの状態によって

登録アクションに飛ばすのか、更新アクションに飛ばすのかを勝手にやってくれます。

便利で楽ですが、何も考えずに使用するといざという時に混乱するのでよく理解しておきましょう。

値の受け取り方

このフォームでは submitボタンを生成していませんが、仮に作成してデータを送信したとします。

その時送信先のコントローラ側で name=post[title]のデータを受け取りたい場合は

params[:post][:title]で取得可能です。

formの項目について

肝心のform要素はユーザからの入力を受け付ける場所です。

そのため入力できる項目を用意する必要があります。

これまで使ったことのあるものについて説明します。

cssとしてBootstrap5のものを使用し、ブロックは fとしています。

基本書式は

f.***_field :value [,オプション]

という形です。valueの名前はなんでも良いです。

コントローラで取り出す際はparams[:value]です。

文字入力 (1行程度の)

<%= f.label :name, class: "form-label"%>
<%= f.text_field :name, class: "form-control md-3" %>

f.labelとすることで入力フォームのラベルを生成することが可能です。

ラベルとはこのフォームには何を入力すべきかを示す文のことです。

このf.label :nameであると nameを入力するフォームであるので Nameとフォームの上に表示されます。

そのためこのNameを見てユーザは Nameを入力すべきだと判断することができます。

f.text_fieldとすることで 1行程度で済む文字列の入力フォームを作成できます。

このデータを受け取る際は上の例であれば params[:name]です。

文章入力 (複数行)

<%= f.label :description, class: "form-label"%>
<%= f.text_area :description, rows: 4, class: "form-control" %>

f.text_areaとすることで 複数行にわたる文字列の入力フォームを作成できます。

rowsオプションを付与すると 4行まで入力できる高さのフォームが作成されます。

このデータを受け取る際は上の例であればparams[:description]です。

数値入力

<%= f.label :price, class: "form-label"%>
<%= f.number_field :price, min: 1, class: "form-control" %>

f.number_fieldとすることで数値の入力が可能となります。

フォームも数値の増減が可能なプルダウンのようなものがついているものが生成されます。

minオプションで入力可能な最小の値を設定することが可能です。

このデータを受け取る際は上の例であれば params[:price]です。

画像入力(ファイルも)

<%= f.label :image, class: "form-label"%>
<%= f.file_field :image, accept: "image/jpeg, image/png", class: "form-control" %>

f.file_fieldとすることでファイル入力が可能となります。

acceptオプションで入力を受け付けるファイルを指定することができます。

今回の場合であれば jpeg形式もしくはpng形式の画像ファイルを入力可能としています。

このデータを受け取る際は上の例であれば params[:image]です。

なお複数枚画像であれば

f.file_filed :image[]となり、params[:image[]]のようになります。

追記 namespace使用したとき

先の説明で form_withの宛先は モデルインスタンスかルーティングヘルパーのどちらかを覚えておけば良いと言いました。

最近他のやり方を知ったので以下に説明します。

名前空間を使っている場合、modelの書き方は次のようになります。

    <%= form_with model: [:admin, @products] do |f| %>

こうすることでadminという名前空間のproductコントローラに

フォームのデータを飛ばすことができます。

終わりに

私が今のところ触ったことあるフォームの内容はこの程度です。

これから色々積み上げていこうと思います。

Rails7 少しばかりのsessionメソッド

はじめに

どうも、torihaziです。

今日は棚卸し回です。

色々ネットを調べながら課題を実装しました。

そのため理解しきれているか怪しかったので1週間前の自分に説明するつもりで

1記事ずつ書いていこうと思います。

HC生の方への直接的な答えにはならないようにします。

セッション

セッションは ブラウザとサーバ間で行われる通信の単位ことです。

クライアントからサーバへ接続するとセッションが始まり、

サーバから切断するとセッションが終わります。

セッションはログインなどに使用されます。

管理する方法としてはセッションを識別するためのセッションIDを生成し、

それをCookieに保存するというやり方があります。

このようにすることでブラウザはクライアントの状態を維持することができます。

状態というのはこの場合、ログインしている状態のことです。

そもそもブラウザとサーバがやり取りする際に使用している通信プロトコルは HTTPです。

HTTPはステートレス、つまりステート(状態)がレス(ない)です。

そのためセッションを使わなければ、接続ごとに以前の情報を忘れて

状態など維持することができません。

Railsにおけるセッション

Railssessionというメソッドを使用してセッションにアクセスすることができます。

セッションはハッシュとして扱うことができます。

セッションの値を取得

session[:key]

セッションに値を格納

session[:key] = value

セッションの値を削除

session.delete(:key)

セッション全体をリセット

reset_session

おまけ

ちなみにセッションが開始されるのはブラウザを開いてアクセスした時です。

逆に終了するのはブラウザを閉じた時です。

そのため例えばその接続されている間だけ何かセッションで管理したいものがあるなら

if !session[:key]
   何かsession管理したいもの
   session[:key] = value
end

みたいにすればセッション管理をすることができます。

終わりに

まだまだ続きます。次です。

HappinessChain Euforia 2期生 1ヶ月目を終えて

はじめに

皆さん、こんにちは torihaziです。

今回は月報回です。

HappinessChainに入って 3ヶ月半

HappinessChain Euforia に入って 1ヶ月

今月を1言で表すなら "辛"です。

何はともあれ1ヶ月意外と早いものですね。いろいろ巻きで頑張ります!

目次

今月の勉強時間について

428h50m - 309h40m =

119h10m!!!

今日分(3/31分)をまだ足し上げていないので

それを加えたら 124,5時間ほどです

先月に比べて + 5,6時間といったところでしょうか。

そもそも日にちが2月に比べて多いのでそんなところでしょう。

勉強時間はこのまま4月も継続していきたいと思っています。

完了したタスクについて

ホームページからの抜粋です。

SQL 、 RESTを終えて、現在は Ruby on Rails と格闘中です。

一応先月の目標の1つである Railsの課題を半分以上終わらせるについては

終わっているとしたいところですが、微妙な感じです。やや遅れ?

ただ無茶苦茶にサボって遅れているわけではないので

そのようなことでめげずに引き続き頑張りたいと思います。

反省点

途中めげた。

先ほどそんなことでめげずに云々と記載しましたが、見出しの通りめげました。

めげた原因は 3つです。1つはSQLのドリル課題、1つは Railsのインプット課題、1つは受講生さんの卒業による焦りです。

まず1つ目についてです。市販の書籍に記載されている章末ドリル問題の物量にめげました。

ここら辺です。1章が終わってやっと終わったと思ったら続いて2章くらい後に控えていました。

絶望でした。

電子書籍を片手にノートに書き、ベッドの上、机に向かいながらなど

朝起きてから夜寝る前などとにかく時間を使ってやりました。

結果やり切れたので良かったです。高校の走り込みを思い出しました。


次の2つ目についてです。これも物量です。

Railsの書籍を読んで実際にコードを書いて勉強しました。

しかしすぐに壁でした。

書いてあること書いてるのに動かない。

去年のPHP学習で経験はしたものの何度やっても精神的に来るものがあります。

めげる暇なんてないとかかっこつけてますね。嘘です。

めげてました。

その後指定の課題を終えてもなんだか不完全燃焼感が否めなかったので

Rails初心者お馴染みの Rails tutorialを 購入して 土日でやり込みました。

3/20に 1日で8章くらいまで終わらせて 21に10章まで終わらせました。

これだけやったからもう大丈夫でしょと思っていたらもう3/20でした。

ここで焦りからくるめげもこの時起きました。


最後については他受講生さんの卒業ラッシュからくる焦りです。

もちろん他受講生さんはかれこれ数ヶ月〜1年前から取り組み学習をされているので

私が追いつくのは確実に無理です。

ただやはり自分も転職を早くしたい身であるので心の底では

いいなぁ、羨ましい。

と思っていたのも事実です。嫉妬というか羨望の眼差しというんでしょうか。

とても喜ばしいことですが、サッカーやっていた経験上、自分もやってやるとも思っていました。

(勘違いしないでください。他人の成功を手放しで喜べないほど人間としては死んでないつもりです。)

兎にも角にもそういうことからくる焦りでめげかけました。

ただ今はそれら全て超えられたと思います。

転職するためには勉強するしかないです。

辛くても萎えたとしてもやるしかないです。

萎えてる暇があるなら勉強しましょう。ただそれだけです。

口だけとか言われないようにやってやろうと思います。

これまでの人生、そうやって下から上がってきたので。

英語の勉強量の配分が下手。

これは昔からの悪癖です。

私は先ほどような焦りがあると分厚い参考書などを

1日で全部終わらす!

という無理なタスクを立ててしまいがちです。後は無理なペースで単語帳などを終わらせたりしようとします。

そして結局終わらせられず、萎えます。

現在はそのようなことを防ぐために 少量を継続しています。

もちろんこんな少なくて良いのかと思う時もありますが、とりあえず続けることを意識しています。

4/21にはTOEICも控えているのでまずは 700超えられるように頑張ります。

良かった点

何はともあれ毎日やっている

めげてはいましたが、勉強をしない日は1日もありませんでした。

めげても転職はさせてくれません。

今の自身の状況にコンプレックスを抱えています。

年収だったり、スキルだったり、会社だったり。

いろいろとお金が足りません。

漠然としていますが、かなりやばいです。

だからやってます。状況を打開するために。

この言い方はベタですね。言い直します。

いろいろと木っ端微塵に吹き飛ばすために。

このマインドを忘れずに4月も邁進していきたいと思います。

寿司打生活 14000を超えることが多くなった。

これはこのスクールに入ってからほぼ毎日(1日抜けることたまにあり)やっています。

毎日やんなさいよ、とも書かれているので。

最初は5000円コースでしたが、今は 10000円コースです。

伸ばし棒だったり、pが苦手でしたが気づいたら打てるようになっていました。

直近のスクショは下記です。人によって評価バラバラだと思いますが

私は成長を実感してます。

できるようになったことの棚卸し

いつの日か見返したときに懐かしむ用です。

あまりに縦に長くなって見づらくなったらはてブロのアーカイブリンクを使用します。

2月 記事2件

  • git の基礎的なコマンド(add commit push pull)
  • docker の基礎的なコマンド (build run)
  • docker compose の基礎的なコマンド (up down)

Docker のコマンド をただ羅列した - Torihaji's Growth Diary

  • docker コンテナのネットワーク

初心者がDocker で 使い捨て PostgreサーバとPostgreクライアントを作る - Torihaji's Growth Diary

3月記事 6件

初心者がREST APIを爆速で理解した(かもしれない)話 - Torihaji's Growth Diary

  • Docker構築中のエラー

Mac M2 でrails x mysql x docker 構築時に no matching manifest for linux/arm64/v8 と言われたら - Torihaji's Growth Diary

  • Railsを齧ってみた。

Rails7 x heroku x Active Storage において本番開発で画像表示に差異が出る。 - Torihaji's Growth Diary

  • Rails7 デプロイ問題

初心者が Ruby on rails を齧ってみた感想 - Torihaji's Growth Diary

  • Rails7 seed + Faker

rails7 seed 日本語 訳して使ってみた - Torihaji's Growth Diary

  • Rails7 Active_storage

rails7 active_storage 導入とそれを使う。by初心者 - Torihaji's Growth Diary

来月の目標

来月の目標は

  • Rails課題 全て終了
  • 記事 3つ
  • 金フレ 毎日 30個はマスト
  • duo 毎日 10こはマスト
  • 解釈 毎日 1問マスト
  • 英熟 毎日 1pマスト
  • リスニング 毎日 1pマスト
  • 英作 毎日 1pマスト

です。

私は今年中に絶対に転職します。

そして5年以内に本業副業込みで900 ~ 1000万稼ぎます。

公言はしました。後はやるだけです。

達成していなかったら、爆笑してください。

会見でも開くので。

現場からは以上です。来月も頑張りましょう。

rails7 active_storage 導入とそれを使う。by初心者

はじめに

こんにちは、torihaziです。

最近使った rails7の active_storage と呼ばれる機能。

初めて使ったときは右に左にぶつかりながらなんとかという状態だったので

PRの結果帰ってくるまでまっすぐ整備して一本道にできるようにします。

じゃltg

目次

ActiveStorageとは

私の理解は次のとおりです。

これを使えば、モデルにおいて画像を紐づけられるようになる。

です。乱暴かもしれませんが、そう理解しています。

詳しくはマニュアルに丸投げします。

railsguides.jp

使ってみる

環境構築

Docker環境

環境についてはお任せします。

私は以前作ったDocker環境で行います。ちなみにmac + Docker 前提です。

Dockerとはナンジャという方は下記記事を見てくらはいふぇ。笑

Docker を初めてみる (Docker Desktopを入れる) - Torihaji's Growth Diary

以下作り方です。

cd ~/Document
git clone https://github.com/torihazi/rails-docker.git tmp
cd tmp
docker compose up -d --build
docker compose run web rails db:create
docker compose run web rails generate scaffold User firstname:string lastname:string email:string
docker compose run web rails db:migrate

ここまで行ってhttps://localhost:3000/usersにアクセスすると次の通りになると思います。

ActiveStorage 導入

コンテナ内で下記コマンドを実行するとdb/schema.rbが下記のように変わります。

rails active_storage:install
rails db:migrate

db/schema.rb

  create_table "active_storage_attachments", force: :cascade do |t|
    t.string "name", null: false
    t.string "record_type", null: false
    t.bigint "record_id", null: false
    t.bigint "blob_id", null: false
    t.datetime "created_at", null: false
    t.index ["blob_id"], name: "index_active_storage_attachments_on_blob_id"
    t.index ["record_type", "record_id", "name", "blob_id"], name: "index_active_storage_attachments_uniqueness", unique: true
  end

  create_table "active_storage_blobs", force: :cascade do |t|
    t.string "key", null: false
    t.string "filename", null: false
    t.string "content_type"
    t.text "metadata"
    t.string "service_name", null: false
    t.bigint "byte_size", null: false
    t.string "checksum"
    t.datetime "created_at", null: false
    t.index ["key"], name: "index_active_storage_blobs_on_key", unique: true
  end

  create_table "active_storage_variant_records", force: :cascade do |t|
    t.bigint "blob_id", null: false
    t.string "variation_digest", null: false
    t.index ["blob_id", "variation_digest"], name: "index_active_storage_variant_records_uniqueness", unique: true
  end

  create_table "tasks", force: :cascade do |t|
    t.string "title"
    t.string "description"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  create_table "users", force: :cascade do |t|
    t.string "firstname"
    t.string "lastname"
    t.string "email"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

  add_foreign_key "active_storage_attachments", "active_storage_blobs", column: "blob_id"
  add_foreign_key "active_storage_variant_records", "active_storage_blobs", column: "blob_id"
end

3つのテーブルが作られます。

  • active_storage_blobs
  • active_storage_attachements
  • active_storage_variant_records

これらテーブルがあることによって先ほど作った Userモデルに画像を紐づけられるようになります。

例えばプロフィール画像です。

もし仮にUserモデルとこれら3テーブルを紐づけるとするならば関係性は次のようになります。

  • Usersテーブルの1レコードは 1つ以上のattachementsと結びつき
  • blobsテーブルの1レコードは 1つ以上の attachementsとvariant_recordsと結びつく

になります。

attachementsテーブルは中間テーブルというものに相当します。

多対多 を解消する目的で使われるテーブルです。

画像の紐付け準備(ファイル編集)

試しに画像を1枚アップロードしてみます。

そのために幾つかファイルを編集します。

1枚の画像をUserモデルに紐づけられるようにapp/models/user.rbに下記を追記します。

class User < ApplicationRecord
  has_one_attached :image (<= ここの名前は :avatarでもなんでも)
end

複数画像を紐づけるならばhas_many_attached :imagesとかです。

やりたい人はそっちで。今回はoneです。

次にコントローラとビューを編集します。

app/controllers/users_controller.rb

~~~
  def create
    @user = User.new(user_params)

    if @user.save
      redirect_to users_url
    else
      render 'new'
    end
  end
~~~
(ファイル末尾, :image追加)
def user_params
    params.require(:user).permit(:firstname, :lastname, :email, :image)
end

app/views/users/index.html.erb(まるっきり変えます)

<p style="color: green"><%= notice %></p>

<h1>Users</h1>

<div id="users">
<table class="design01">
  <tr>
    <th>firstname</th>
    <th>lastname</th>
    <th>email</th>
    <th>Image</th>
  </tr>
  <% @users.each do |user| %>
  <tr>
    <td><%= user.firstname %></td>
    <td><%= user.lastname %></td>
    <td><%= user.email %></td>
    <% if user.image.attached? %>
      <td><%= image_tag user.image %></td>
    <% end %>
   </tr>
<% end %>
</table>
</div>

<%= link_to "New user", new_user_path %>

app/views/users/_form.html.erb

form_withの中に下記を追記
<div>
  <%= form.label :image, style: "display: block" %>
  <%= form.file_field :image %>
</div>

app/assets/stylesheets/application.css

  .design01 {
  width: 100%;
  text-align: center;
  border-collapse: collapse;
  border-spacing: 0;
 }
 .design01 th {
  padding: 10px;
  background: #e9faf9;
  border: solid 1px #778ca3;
 }
 .design01 td {
  padding: 10px;
  border: solid 1px #778ca3;
 }

 .design01 img {
  width: 100px;
  height: auto;
 }

ここまでやってlocalhostにアクセスすると次のようになると思います。

New Userをクリックしたときは以下

ここまで来たらあとはアップロードするだけです。

ファイルアップロード

コンソール立ち上げて rails cから追加してもいいですが今回は サイトの方から行います。

適当な値を入力してアップロードします。

成功すると Indexページに戻り、次の画面が表示されると思います。

これでUserモデルの1レコードに紐づく画像を登録することができました。

余談(Fakerも使ってアップロード)

例えば開発環境やテスト環境でとりあえず数十個一気にぶち込みたいなんていう時があると思います。

そんなときは Fakerというgemを入れて次のようにやってみてください。

1. fakerを入れて各種設定をする。

rails7 seed 日本語 訳して使ってみた - Torihaji's Growth Diary

2. サンプル画像をapp/assets/images配下に配置

3.db/seeds.rbを編集

db/seeds.rb

unless Rails.env.production?
  50.times do
    user = User.new(firstname: Faker::Name.first_name,
                    lastname: Faker::Name.last_name,
                    email: Faker::Internet.email(domain: "gmail.com")
                    )
    user.image.attach(
      io: File.open(Rails.root.join('app/assets/images/450x300.jpg')),
      filename: '450x300.jpg'
    )
    user.save
  end
end

4.コマンド実行

コンテナに入って rails db:seed実行してください。

(気になる人は先ほど追加した1件を削除してから上のコマンド打ってください。私は消してます。)

するとIndexページに50個追加されていると思います。全部は長いので無理です。

気になる人は view ファイルに <%= user.id %>も追加してみてください。

id追加したものがこちらです。50個ありますよね。

ちなみにこれを描画する際に 1 + n問題 というものが発生しています。

今回はサンプルなので無視してます。

気になる人はそれも解決してみてください。

終わりに

いかがだったでしょうか。

active_storageに加えて seedで一気に50個どばっと入れられるようになりました。

まだまだマサラタウンかもしれませんが、これから頑張ります。

初心者なりに頑張ります。

皆さんも頑張ってください。

rails7 seed 日本語 訳して使ってみた

はじめに

おはようございます!torihaziです。

現在、やっているecサイト課題で seed というものを使ったので

その備忘録です!

読了時間は10しないと思います!

理解は秒です!

ではどうぞ! ltg!

そもそもseedとは

データベースを作成したときに、テストデータを何個か入れたい!

てなった時にいくつかドバーッとテストデータを流し込んでくれるものです

使い方

そもそもどこにあるのかというとdb/seeds.rbです。

そこにモデル.createの要領で書けば良いです。

その後に rails db:seedを実行すれば勝手にデータベースに追加してくれます。


ただ1、2個程度追加するためだけに seeds.rbを使用するのはめんどくさいです。

これらが真価を発揮する時は数十個を追加するときです。

例えばこんなとき

User.create!(firstname: "佐藤", lastname: "たける", age: 14)
User.create!(firstname: "後藤", lastname: "たけし", age: 44)
User.create!(firstname: "内藤", lastname: "りょうた", age: 34)
User.create!(firstname: "加藤", lastname: "たけ", age: 23)
・・・
・・・
・・・
・・・
あと50件くらい

これを1行1行書く気が起きますか?

起きないですよね。

ただ、もちろん上の書き方でもできます。

それがだるいのでこんな感じで描きます。

Fakerというgemを入れてください!

50.times do
  User.create(
    firstname: Faker::Name.first_name,
    lastname: Faker::Name.last_name,
    email: Faker::Internet.email(domain: "gmail.com")
  )
end

ただこのままだと日本語でないのでconfig/application.rbに下記を追加します。

module Myapp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 7.0
    config.i18n.default_locale = :ja <= これ

  end
end

そうすると、一気に次のようにデータをぶち込めます。

すぐに試したい方へ

環境は私の過去記事を元にやってみてください。

github.com

cd ~/Document
git clone https://github.com/torihazi/rails-docker.git tmp
docker compose up -d --build
docker compose run web rails db:create
docker compose run web rails generate scaffold User firstname:string lastname:string email:string
docker compose run web rails db:migrate

その後に次のファイルを編集してください

app/views/users/index.html.erb

<p style="color: green"><%= notice %></p>

<h1>Users</h1>

<div id="users">
<table class="design01">
  <tr>
    <th>firstname</th>
    <th>lastname</th>
    <th>email</th>
  </tr>
  <% @users.each do |user| %>
  <tr>
    <td><%= user.firstname %></td>
    <td><%= user.lastname %></td>
    <td><%= user.email %></td>
  </tr>
<% end %>
</table>
</div>

<%= link_to "New user", new_user_path %>

app/assets/stylesheets/application.css

 .design01 {
  width: 100%;
  text-align: center;
  border-collapse: collapse;
  border-spacing: 0;
 }
 .design01 th {
  padding: 10px;
  background: #e9faf9;
  border: solid 1px #778ca3;
 }
 .design01 td {
  padding: 10px;
  border: solid 1px #778ca3;
 }

Gemfile 追加して bundle install

ファイル末尾に
gem `faker'

config/application.rb

module Myapp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 7.0
    config.i18n.default_locale = :ja <= これ追加

    # Configuration for the application, engines, and railties goes here.
    #
    # These settings can be overridden in specific environments using the files
    # in config/environments, which are processed later.
    #
    # config.time_zone = "Central Time (US & Canada)"
    # config.eager_load_paths << Rails.root.join("extras")
  end
end

db/seeds/rb

50.times do
  User.create(
    firstname: Faker::Name.first_name,
    lastname: Faker::Name.last_name,
    email: Faker::Internet.email(domain: "gmail.com")
  )
end

ここまで終わったら最後に

docker compose run web rails db:seed

を実行して結果を確認してください

このようにすれば行けます。行けなかったら連絡ください( ´ ▽ ` )

http://localhost:3000/users

終わりに

どうでしたか?

やってみれば行けます。

私は初心者です!ゆえに誰でも理解できます!!

応援してます!!!

私も頑張ります!!

Rails7 x heroku x Active Storage において本番開発で画像表示に差異が出る。

はじめに

こんにちは。torihaziです。

苛立っています。

エラー解決できません。

これ書いている今も解決していません。

これから色々試します。

構成は気にしていません。ltg.

追記 : 記事書き終わって無事解決

現状

現在、ローカル環境で ecサイトを制作しています。

ローカルでは画像が表示されたのに対し、

デプロイ後の本番環境では画像が表示されません。

開発環境

本番環境

お馴染みのよく見るアイコンですね。

大抵こういう時は画像のパスが間違っていることがほとんどです。のはず。

ということで色々昨日からいじってました。

やったこと1: 拡張子の変更(jpegから jpg)

次の記事を参考にしました。

qiita.com

確かに私のものは jpegとなっていました。

そのためそれを変更しました。

私はseedでデプロイ環境にデータを入れているのでコードを修正し

app/assets/images配下にあるファイル名も "jpg"に変更しました。

50.times do 
  product = Product.create!(name: Faker::Commerce.product_name,
                            price: (Faker::Commerce.price * 100).floor(-2),
                            description: 'テストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテストテスト')
  product.image.attach(
    io: File.open(Rails.root.join('app/assets/images/450x300.jpg')),
    filename: '450x300.jpg'
  )
end

しかし結果は変わらず。検証ツールを開いてみても"404 not found"でした。

やってみたこと2 : AWS S3を使用する

調べてみると、本番環境では クラウドストレージを使用するのが良いそう。

理由はherokuのローカルストレージは一時的なもので永続的に保存はされないから。

ChatGPTもそう言ってました。

config.active_storage.serviceが:localに設定されているということは、
アップロードされた画像はローカルのストレージに保存されています。
そのため、Heroku上の本番環境では画像が表示されない可能性が高いです。
Herokuのファイルシステムはephemeral(一時的な)なので、
アプリケーションのディスクに保存されたファイルは永続的ではありません。

ということで S3路線に変更。

次の記事を参考にしました。

qiita.com

pikawaka.com

gemは次を追加して bundle install

# env
gem 'dotenv-rails'

# aws storage
gem 'aws-sdk-s3', require: false

.gitignore に/.envとすることを忘れずに。

storage.ymlも.envも変更し、git push heroku ブランチ名:main

成功したが、not found

本当に S3と連携されているのか。

heroku configでアクセスキー設定を確認

表示されていた。

よくよく見てみると、ファイルの保存先URL(上画像右下)がactive_storage。

AWSのコンソールにも ファイルアップロードされている痕跡なし。

ということでherokuのdbをリセット

heroku pg:reset DATABASEした後にアプリ名。

その後に heroku run rails db:migrate

その後に heroku run rails db:seed

ログにもS3 Storage が出ているし、多分成功している。

S3に連携されていることを確認

さぁアプリに戻ってリロード。緊張の瞬間。

狂喜乱舞。成功。

これで贅沢なゴムバッグが買えるようになりました。

終わりに

かなり辛かったです。

言われたこと、書いていることををしているのに違う結果になる。

それとネットには誤った情報が溢れているなと感じました。

例えば下記。

config/environments/production.rb の config.assets.compile = false の値を trueにする。

これはダメだそうです。アプリの動作に影響を及ぼすから。

参考記事にも詳細な説明が載っています。

しかし、ネットのいくつかのサイトには そうやるのが正解です、と

胸を張って堂々と言っている記事もありました。

情報発信者として自身も学習を怠らず、努力を続けていくべきだと思いました。

兎にも角にもうまくいってよかったです。

みなさんも デプロイする際はストレージに気をつけて、学習頑張ってください。

僕も頑張ります。

Rails tutorial 4章 わかったことまとめ

はじめに

どぅ〜〜も〜〜、torihaziです!!

続きです!!

4章です!!!ここから有料コンテンツなので、内容には気をつけます!!

流し読みしながらわかったこと

組み込みヘルパー

Railsが用意している関数のこと。

カスタムヘルパー

開発者が独自に作る関数のこと。

ハッシュが引数

メソッドにおいてハッシュがメソッド呼び出しの最後の引数である場合、{}を省略できる。

終わりに。

最初のRuby学習で学んだことがほとんどでした。

故に飛ばします。