- テーブル作成の準備
- 日付・時刻を日本時間に変換
- エラーメッセージ表示<.errors.full_messages>
- 簡単なメッセージを画面に表示<flash>
- ユーザー画像を表示
- 配列の要素数・テーブルのデータ数を取得<count>
- Renderでデプロイする準備
- Renderを使うためのGitの設定
- form_withとform_tagの違い
- ストロングパラメータ
- destroyアクションに実装させるturbo_methodとturbo_confirm
- ビューの共通化
- CRUDとは
- 外部キーreferencesを使ったRailsモデルの関連付け
- 【Rails】newメソッドとcreateメソッドの違い
- 【Rails】updateメソッドとupdateアクションの違い
まずはマイグレーションファイルと呼ばれる、データベースに指示を出すファイルを作成する
また、「text」は「長い文字列」を意味しており、contentカラムにどのようなデータが入るか意味している
rails generate model モデル名 [属性名:データ型 ...]
ポストの例
rails g model Post content:text
例えば、Userという名前のモデルを生成し、そのモデルにnameとemailという属性を持たせる場合、次のようになる
rails g model User name:string email:string
アプリ名/ ➡ db/ ➡ migrate/ ➡ 20240409120941_create_posts.rb(マイグレーションファイル)
データベースに変更を反映させるためのコマンドで、3つのカラムが自動で生成される
<注意>マイグレーションファイルを作成した場合は必ず「rails db:migrate」を実行する
rails db:migrate
「rails g model」コマンドによってPostモデルが定義されたファイル「post.rb」が、app/modelsフォルダの中に作成されている。
ファイルの中には、ApplicationRecordクラス
を継承するPostクラス
が定義されている。
このようにApplicationRecordを継承したクラスをモデルと呼ぶ。
class Post < ApplicationRecord
end
Rubyのコードを手軽に実行できる環境のことで、データベースに追加していく
終了したい時はquit
rails console
データを追加する方法は
① 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")
SNSなどの文章投稿機能で文字数オーバーや空投稿をした時に
Railsではエラーメッセージを表示することができます。
post = Post.new # 空の投稿
post.save # 保存
post.errors.full_messages # エラーメッセージのリストを取得
一度の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"」で画像選択できる
<%= 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メソッド
を用いることで画像データを取得できる
likeテーブルの全データ数を取得する方法:
Like.all.count
likeテーブルで、特定の条件(例えば write_id が2のレコード)のデータ数を取得する方法:
Like.where(write_id: 2).count
ここで使用される .where メソッドは、指定された条件に合致するレコードをフィルタリングし、その結果に対して .count を適用することで、該当するレコードの数を取得します。
1)12&13行目のsqlite3を切り取り、55行目から始まるgroup :development doの中にペースト
# Use sqlite3 as the database for Active Record
gem "sqlite3", "~> 1.4"
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
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!ののコメントアウトを削除してこの行を有効にする
14)bin ➡ 新規ファイル作成 ➡ 「render-build.sh」
15)https://gist.github.com/ynakayu/a48392adc6bce5d9c75064ade6b314a6
※テキストをコピーする
16)Git Bash ➡ 該当アプリフォルダ ➡ 作成スクリプト全てのユーザーに実効権限を与えるコマンド入力
chmod a+x bin/render-build.sh
1)以下のGitコマンド
git init
2)管理するファイルの選択
※全てを選択して追加するという意味になる
git add -A
①モデル指定:最初から適切なURLやHTTPメソッドを設定できる
②簡潔な記述:モデルの属性に基づいて記述できるので、簡潔になる
③統一された記述方法:form.text_areaなどのメソッドを使って、HTMLの<textarea>タグなどを簡潔に生成できる
④デフォルトで非同期送信: form_withはデフォルトで非同期リクエスト(Ajax)を使用しますが、local: trueオプションを指定することで通常のフォーム送信も可能
①手動設定: フォームの送信先URLやHTTPメソッドを手動で指定する必要があります。
②手動でフィールド生成: 各フィールドを手動で生成します。
※以下の変更例は@questionモデルオブジェクトに基づいたフォームを生成しています。
<%= form.text_field :title %>
これは以下のHTMLタグを生成します
<input type="text" name="title" id="question_title">
<%= form.text_area :content %>
これは以下のHTMLタグを生成します
<textarea name="content" id="question_content"></textarea>
<%= form.submit %>
これは以下のHTMLタグを生成します
<input type="submit" value="Create Question">
- モデル名: モデル名は小文字に変換されます。
- 属性名: 属性名も小文字で使用されます。
- IDの構成: id属性は、モデル名と属性名をアンダースコアでつないだ形式になります。
モデル名:Question
属性名 :title
Railsのフォームヘルパーは以下のようにIDを生成します:
- モデル名:question(小文字)
- 属性名 :title(そのまま)
- IDの構成:question_title
同様に、Questionモデルのcontent属性に対しては、id="question_content"が生成されます。
例: 質問の作成と更新
モデル: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 %>
Railsコントローラーで利用可能なオブジェクトで、リクエストのパラメータ(フォームデータ、URLパラメータなど)を含んでいます。
慣習として
モデル名_params
リクエストパラメータからquestionキーを持つハッシュを要求します。
params.require(:question)
permitメソッドは、指定されたキーのみを含む新しいハッシュを返します。
ここでは、title、name、contentの3つのキーを許可しています。これにより、これらのキー以外のパラメータが含まれていたとしても、それらは無視されます。
params.require(:question).permit(:title, :name, :content)
この操作によって、title、name、content以外のパラメータはすべて削除されます。
- 'params'から'question'キーを持つハッシュを取得。
- 'question'キーが存在しない場合、エラーを発生させる。
- questionハッシュから、title、name、contentキーのみを許可。
- 他のすべてのキーは無視される。
これにより、リクエストから受け取ったパラメータのうち、許可されたものだけをフィルタリングして取得できます。
これがストロングパラメータの概念であり、セキュリティを確保するための重要な仕組みです。
Qiita記事↓
https://qiita.com/yusuke62/items/d2bcd9efff8c0dfb1ae4
Qiita記事↓
https://qiita.com/yusuke62/items/1a6b79e8004d38b5b467
Qiita記事↓
https://qiita.com/yusuke62/items/
Qiita記事↓
https://qiita.com/yusuke62/items/085fe7a717d11765480f
Qiita記事↓
https://qiita.com/yusuke62/items/9841208e641a04ed64b5
Qiita記事↓
https://qiita.com/yusuke62/items/7c520ab5b2fbe5af607a