🍡

Rails エラーメモ

2023/04/07に公開

今日はメンターさんに3回も質問したので、
メモとして残しておく!


アプリケーションを完成させよう2 7章

Aboutページの作成

ルーティングがまだ理解しきれておらず、
Aboutページの表示でつまづいた。

get '/about' => 'homes#about'

こうしてhomes/aboutで検索かけてた😂

get 'homes/about' => 'homes#about'

homes/aboutの部分を変えるとPrefixも自動で変わってた!

今回はhomes/aboutの指定で名前付きルートはaboutに設定しなければいけなかったので
👇
名前付きルートを任意の名前にする方法!

as:オプションを使うと名前付きルートの名前を変えられる。

get 'homes/about',to: 'homes#about',as: 'about'

👇
これで完成!
rails routesで確認

about GET    /homes/about(.:format)     homes#about

φ(・
https://techtechmedia.com/routing-customize-rails/#:~:text=URI Patternとはルーティング,のアクションを動かします。&text=URI Patternをカスタマイズする,パスを記述します。

パスとURLの違い

メンターさんがパスとURLは若干違うと仰っていたので調べてみた!

  • パス (Path):
    パスは、リソースにアクセスするためのアプリケーション内部の相対的なアドレス。
    パスは、ドメイン名やスキーム(HTTPまたはHTTPS)などを含まず、リソースの場所を示す "/" で始まる文字列。例えば、/users/1のような形式。パスは、リンクやフォーム内でよく使用される。

  • URL (Uniform Resource Locator):
    URLは、リソースにアクセスするためのインターネット上の完全なアドレス。
    URLは、スキーム、ドメイン名、ポート番号(省略可能)、パス、およびクエリストリングなどのすべての情報を含んでいる。例えば、https://example.com/users/1のような形式。 URLは、外部リソースへのリンクや、メールなどで送信するリンクに使用される。

簡単にいうと、パスはアプリケーション内部での相対的なアドレスであり、URLはインターネット上の完全なアドレスのこと。

8章【投稿機能の作成(1) - モデルを準備しよう(1)】

モデル作成
👇
migrationファイルに、テーブルの内容を書いていく
👇

rails db:migrate

migrateする時の注意!

※注意点として、id,created_at, updated_atの3つのカラムは自動で作成されるため
マイグレーションファイルを編集する際に追加しないように気をつけましょう。

t.integer :id

まで追加していたせいでエラーが起きた、、!

you can't redefine the primary key column 'id'. To define a custom primary key, pass { id: false } to create_table.
主キー列 'id' を再定義することはできませんとエラー文が出ている。

正しいテーブルの内容

class CreatePostImages < ActiveRecord::Migration[6.1]
  def change
    create_table :post_images do |t|
      t.string :shop_name
      t.text :caption
      t.integer :user_id

      t.timestamps
    end
  end
end

9章【投稿機能の作成(2) - モデルを準備しよう(2)】

Controller作成と同時にアクションとviewファイルを作成

(new, index, show アクションを同時に作成)

rails g controller PostImages new index show

で一つのアクションだけでなく、複数のアクションを同時作成できた!

rails g controller コントローラ名 アクション名

φ(・
https://qiita.com/yusuke1209kitamura/items/b9b2489a78de278c48cc

###アソシエーションについては後日まとめたい!

resources

resources メソッドは、ルーティングを一括して自動生成してくれる機能

resources :post_images, only: [:new, :index, :show]

onlyオプションを使用することで、生成するルーティングを限定することができる!

resources の機能は一部で、他にもさまざまなオプションがある。

φ(・・ あとでじっくり読みたい!
https://railsguides.jp/routing.html#単数形リソース

10章【投稿機能の作成(3) - 投稿できるようにしよう】

投稿データの保存をコントローラーに記述する際

予測変換で勝手にsaveがsavedになってしまっておりまたエラーが発生していた。
最近誤字エラー結構多いので注意!

正しいコード

  def create
    @post_image = PostImage.new(post_image_params)
    @post_image.user_id = current_user.id
    @post_image.save
    redirect_to post_images_path
  end

投稿確認をする際

resources に create を追加し忘れていてNo route matches [POST] "/post_images"が発生

resources :post_images, only: [:new, :create, :index, :show]

φ(・
ちなみにカリキュラムではindexページがまだないとなっているが、
コントローラーを作成する際に一緒に作っているのでUnknown actionとはならずこの時点でindexページに遷移できる。

11章 投稿機能の作成(4) - 投稿一覧を見れるようにしよう】

ActiveStorageについて_φ(・_・
https://railsguides.jp/active_storage_overview.html#active-storageについて

12章【投稿機能の作成(5) - 投稿ごとの画面を作ろう】

コントローラーのshowアクションの記述についての記述が誤っていた
(アプリケーションを完成させよう 4章も参照した)

間違い

def show
    @post_image = PostImage.find(post_image_params[:id])
  end

  private

  def post_image_params
    params.require(:post_image).permit(:shop_name, :image, :caption)
  end

def show
    @post_image = PostImage.find(params[:id])
  end

  private

  def post_image_params
    params.require(:post_image).permit(:shop_name, :image, :caption)
  end

必要なデータはidだったのにストロングパラメーターを引数に使ってしまっていたので
その中にはidがなく、エラーが発生してしまっていた。。

Rubyのfindについて

findメソッドは、データベースからレコードを検索するために使用されるActive Recordのメソッド。
主に主キー(通常はid)を使って、特定のレコードを取得する。

ちなみに、find_byメソッドというものもある!

Rails find_byは、あるカラムを使ってレコードを検索し、最初に一致したものを返す!

【Rails findとfind_byの違い】

・findメソッド⇒引数に取るのはid(属性は取らない)

・find_byメソッド⇒引数に取るのは属性(idは取らない)

paramsとは

Railsで送られてきた値を受け取るためのメソッド。

基本的に

params[:カラム名]

で値を受け取ることができる!

参考_φ(・_・
https://www.sejuku.net/blog/29763
https://www.javadrive.jp/rails/controller/index6.html

ターミナルでみると階層になっている

参考_φ(・_・
https://qiita.com/keijitsumori/items/f17a56a583a3c24a88a3#:~:text=「パラメータがないか、値が空です」&text=このパラメータの中身が,意味だったのです。

ストロングパラメータとは

ストロングパラメータはコントローラーで送られてきたパラメータを安全に受け取るための仕組み

requireとは必要とするで、permitは許可をするという意味。


今日は1UPイベントがあって、いつものチームと違う人と話せる機会があった!
意外と勉強時間を確保できていないという人が多かった👀

私のこれからの改善点は

  • 1日1回以上質問すること
  • デイリースクラムでただ今日やること、明日やることだけの発表ではなく、
    『なぜ』それをしたのか、これからするのかまで深掘りし、日々の学習の調整に活かせるようにすること
  • もっと好奇心を持って勉強すること
  • 就活の方も時間に余裕を持って進められるよう計画をたてること

そして、カリキュラムもっと進めたかったけど気づいたらもうこんな時間!
やっぱりルーティング難しい!
いざ自分で穴埋めとなると分かってない^^;
でもメンターさんのおかげで頭が少し整理できたかな

明日はキャリアガイダンスで2時間取られるから早く起きて進めよう
パワーー

Discussion