Skip to content

Yusuke0620/Ruby-on-Rails_-Reference

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 

Repository files navigation

目次


  • 1. マイグレーションファイル作成







テーブル作成の準備


  • 1. マイグレーションファイル作成

まずはマイグレーションファイルと呼ばれる、データベースに指示を出すファイルを作成する
また、「text」は「長い文字列」を意味しており、contentカラムにどのようなデータが入るか意味している

rails generate model モデル名 [属性名:データ型 ...]

ポストの例

rails g model Post content:text

例えば、Userという名前のモデルを生成し、そのモデルにnameとemailという属性を持たせる場合、次のようになる

rails g model User name:string email:string


  • 2. ファイルが作成場所確認

アプリ名/ ➡ db/ ➡ migrate/ ➡ 20240409120941_create_posts.rb(マイグレーションファイル)



  • 3. テーブルを用意

データベースに変更を反映させるためのコマンドで、3つのカラムが自動で生成される
<注意>マイグレーションファイルを作成した場合は必ず「rails db:migrate」を実行する

rails db:migrate


  • 4. モデル

「rails g model」コマンドによってPostモデルが定義されたファイル「post.rb」が、app/modelsフォルダの中に作成されている。 ファイルの中には、ApplicationRecordクラスを継承するPostクラスが定義されている。 このようにApplicationRecordを継承したクラスをモデルと呼ぶ。

class Post < ApplicationRecord
  
end


  • 5. rails consoleを使う

Rubyのコードを手軽に実行できる環境のことで、データベースに追加していく
終了したい時はquit

rails console


  • 6. テーブルにデータを保存・newメソッド・saveメソッド

データを追加する方法は
① new メソッドで Post モデルのインスタンスを作成
② posts テーブルに保存

# モデルのインスタンスを作成
user = User.new

# 属性を指定してインスタンスを作成
user = User.new(name: "John", email: "[email protected]")

# インスタンスの保存
user.save


日付・時刻を日本時間に変換


日本時間に変換するには、Active Supportライブラリのin_time_zoneメソッドを使用。
created_at 属性の日時が日本時間に変換され、指定された形式で表示されます。
同様に、updated_at属性についても同じ方法で変換できます。
in_time_zone メソッドには、任意のタイムゾーンを指定できます。ここでは "Tokyo" を指定していますが、他のタイムゾーンを指定することもできます。
post.created_at.in_time_zone("Tokyo").strftime("%Y/%m/%d %H:%M")

screenshot_01



エラーメッセージ表示<.errors.full_messages>


SNSなどの文章投稿機能で文字数オーバーや空投稿をした時に
Railsではエラーメッセージを表示することができます。
post = Post.new            # 空の投稿
post.save                  # 保存
post.errors.full_messages  # エラーメッセージのリストを取得


簡単なメッセージを画面に表示<flash>


一度のHTTPリクエストでのみ有効な一時的なメッセージを保存するためのRailsの仕組み
通常、ユーザーに対する成功メッセージやエラーメッセージを表示する際に使用されます。
一度表示されると、その後のリクエストではメッセージがクリアされます
# コントローラーのアクション内で成功メッセージを設定
def create
  @post = Post.new(post_params)
  if @post.save
    flash[:success] = "Post successfully created!"
    redirect_to @post
  else
    flash[:error] = "Failed to create post."
    render :new
  end
end
# ビュー内でflashメッセージを表示
<% if flash[:success] %>
  <div class="alert alert-success">
    <%= flash[:success] %>
  </div>
<% end %>

<% if flash[:error] %>
  <div class="alert alert-danger">
    <%= flash[:error] %>
  </div>
<% end %>




- [ユーザー画像を表示](#display-user-images)



ユーザー画像を表示

  • 〇. 画像選択ボタン

<h1>画像</h1>
<input name="image" type="file"> # 「type="file"」で画像選択できる

screenshot_22


  • 〇. 画像の送信<multipart : true>

<%= form_tag("...", {multipart: true}) do %> # 画像を送信したい時などにつける必要がある

以上がファイルをアップロードする準備 ここからは ①ファイル名をデータベースに保存 ②publicフォルダに画像ファイルを保存


  • 〇. データベースにファイル名保存

def アクション名
 if params[:image] # 画像が送信されているか判定する
  @変数 = モデル名からid取得
  @変数.画像カラム名 = 
  image = params[:image] # 送信されたファイルが入っている
  File.binwrite("public/#{@変数.画像カラム名}", image.read) # ファイルの場所
 end
end

if params[:image]は画像データが送信された時だけ画像を更新するように判定する処理
※画像データは特殊なテキストファイルなのでFile.binwriteを使う
readメソッドを用いることで画像データを取得できる




配列の要素数・テーブルのデータ数を取得<count>

likeテーブルの全データ数を取得する方法:

Like.all.count

likeテーブルで、特定の条件(例えば write_id が2のレコード)のデータ数を取得する方法:

Like.where(write_id: 2).count

ここで使用される .where メソッドは、指定された条件に合致するレコードをフィルタリングし、その結果に対して .count を適用することで、該当するレコードの数を取得します。




Renderでデプロイする準備


  • 1. sqlite3を切り取りPostgreSQL設定

1)12&13行目のsqlite3を切り取り、55行目から始まるgroup :development doの中にペースト

# Use sqlite3 as the database for Active Record
gem "sqlite3", "~> 1.4"

  • 2. PostgreSQLのGemの設定

2)一番下にスクロールし次のように記述 ※これで本番環境でのみPGという名のGemがインストールされる、pgはRailsからPostgreSQLを操作する時に使うGem

group :production do
  gem 'pg', '~> 1.2.3'
end

3)開発環境で使うGemのインストール※ターミナルに入力
bundle install --without production

確認方法

less .bundle/cmonfig

Windowsで使えない場合

type .bundle\config


  • 3.

4)config ➡ database.ymlファイルを開く

5)25行目のsqliteの行を削除し、次を入力
※ymlはインデントが重要な役割を果たすので、必ずTABキーで設定する

  adapter:  postgresql # PostgreSQLのデータベースに接続するという設定
  encoding: unicode    # 日本語でも扱える文字コード
  url:      <%= ENV['DATABASE_URL'] %> # データベースのURLは環境変巣から取得するように設定

6)config ➡ environments ➡ production.rbを開く
※Railsの本番環境用の設定ができる

7)31行目のconfig.assets.compileをtrueにする
※assets.compileとはCSSやJavaScriptを連結して高速化すること
config.assets.compile = true


8)25行目の最後に「スペース|| ENV['RENDER'].resent?」

config.public_file_server.enabled = ENV["RENDER"].present?

9)ルーティングに記述

  root 'questions#index'
  resources :questions do
    resources :answers
    end
  end

10)config ➡ puma.rbを開く

11)33行目付近の# workers ENV.fetch("WEB_CONCURRENCY") { 2 }のコメントアウトを削除してこの行を有効にする

12){ 2 }を{ 4 }に変更する

13)40行目付近の# preload_app!ののコメントアウトを削除してこの行を有効にする



  • 4.ビルドするためのscriptを指定する

14)bin ➡ 新規ファイル作成 ➡ 「render-build.sh」

15)https://gist.github.com/ynakayu/a48392adc6bce5d9c75064ade6b314a6
※テキストをコピーする 16)Git Bash ➡ 該当アプリフォルダ ➡ 作成スクリプト全てのユーザーに実効権限を与えるコマンド入力

chmod a+x bin/render-build.sh



Renderを使うためのGitの設定


  • 1. リポジトリ新規作成

1)以下のGitコマンド

git init

2)管理するファイルの選択
※全てを選択して追加するという意味になる
git add -A



form_withとform_tagの違い


<form_with>

①モデル指定:最初から適切なURLやHTTPメソッドを設定できる
②簡潔な記述:モデルの属性に基づいて記述できるので、簡潔になる
③統一された記述方法:form.text_areaなどのメソッドを使って、HTMLの<textarea>タグなどを簡潔に生成できる
④デフォルトで非同期送信: form_withはデフォルトで非同期リクエスト(Ajax)を使用しますが、local: trueオプションを指定することで通常のフォーム送信も可能

<form_tag>

①手動設定: フォームの送信先URLやHTTPメソッドを手動で指定する必要があります。
②手動でフィールド生成: 各フィールドを手動で生成します。

※以下の変更例は@questionモデルオブジェクトに基づいたフォームを生成しています。


変更例1

<%= form.text_field :title %>

これは以下のHTMLタグを生成します

<input type="text" name="title" id="question_title">

変更例2

<%= form.text_area :content %>

これは以下のHTMLタグを生成します

<textarea name="content" id="question_content"></textarea>

変更例3

<%= form.submit %>

これは以下のHTMLタグを生成します

<input type="submit" value="Create Question">

IDの生成基準

  1. モデル名: モデル名は小文字に変換されます。
  2. 属性名: 属性名も小文字で使用されます。
  3. IDの構成: id属性は、モデル名と属性名をアンダースコアでつないだ形式になります。

具体的な例

モデル名:Question
属性名 :title
Railsのフォームヘルパーは以下のようにIDを生成します:

  • モデル名:question(小文字)
  • 属性名 :title(そのまま)
  • IDの構成:question_title

同様に、Questionモデルのcontent属性に対しては、id="question_content"が生成されます。




ストロングパラメータ


  • 1. 設定方法



例: 質問の作成と更新
モデル:Question
まず、Questionモデルがあると仮定します。

class Question < ApplicationRecord
  # title, name, contentの属性を持つ
end

コントローラー
次に、QuestionsControllerでストロングパラメータを設定します。

class QuestionsController < ApplicationController
  def new
    @question = Question.new
  end

  def create
    @question = Question.new(question_params)
    if @question.save
      redirect_to @question, notice: '質問が作成されました。'
    else
      render :new
    end
  end

  def edit
    @question = Question.find(params[:id])
  end

  def update
    @question = Question.find(params[:id])
    if @question.update(question_params)
      redirect_to @question, notice: '質問が更新されました。'
    else
      render :edit
    end
  end

  private

  # ストロングパラメータを定義
  def question_params
    params.require(:question).permit(:title, :name, :content)
  end
end

ビュー

以下のように、新しい質問を作成するフォームを作成します。

<h1>New question</h1>

<%= form_with model: @question, local: true do |form| %>
  <div>
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>
  <div>
    <%= form.label :name %>
    <%= form.text_field :name %>
  </div>
  <div>
    <%= form.label :content %>
    <%= form.text_area :content %>
  </div>
  <div>
    <%= form.submit '作成' %>
  </div>
<% end %>


  • 2. 分解して解説


1. params

Railsコントローラーで利用可能なオブジェクトで、リクエストのパラメータ(フォームデータ、URLパラメータなど)を含んでいます。

モデル名

慣習として

モデル名_params

2. require(:question)

リクエストパラメータからquestionキーを持つハッシュを要求します。

params.require(:question)

3. permit(:title, :name, :content)

permitメソッドは、指定されたキーのみを含む新しいハッシュを返します。
ここでは、title、name、contentの3つのキーを許可しています。これにより、これらのキー以外のパラメータが含まれていたとしても、それらは無視されます。

params.require(:question).permit(:title, :name, :content)

この操作によって、title、name、content以外のパラメータはすべて削除されます。



全体の流れ

①params.require(:question):

  • 'params'から'question'キーを持つハッシュを取得。
  • 'question'キーが存在しない場合、エラーを発生させる。

②permit(:title, :name, :content):

  • questionハッシュから、title、name、contentキーのみを許可。
  • 他のすべてのキーは無視される。

これにより、リクエストから受け取ったパラメータのうち、許可されたものだけをフィルタリングして取得できます。
これがストロングパラメータの概念であり、セキュリティを確保するための重要な仕組みです。




destroyアクションに実装させるturbo_methodとturbo_confirm

Qiita記事↓
https://qiita.com/yusuke62/items/d2bcd9efff8c0dfb1ae4




ビューの共通化

Qiita記事↓
https://qiita.com/yusuke62/items/1a6b79e8004d38b5b467




CRUDとは 

Qiita記事↓
https://qiita.com/yusuke62/items/




外部キーreferencesを使ったRailsモデルの関連付け

Qiita記事↓
https://qiita.com/yusuke62/items/085fe7a717d11765480f




newメソッドとcreateメソッドの違い

Qiita記事↓
https://qiita.com/yusuke62/items/9841208e641a04ed64b5




【Rails】updateメソッドとupdateアクションの違い

Qiita記事↓
https://qiita.com/yusuke62/items/7c520ab5b2fbe5af607a




About

Ruby on Railsのマイリファレンス

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published