自分用のアウトプット。
ページ作成は
ルーティング → コントローラー → モデル → ビュー
が基本的な流れ。
(本記事内ではルーティングの設定は適宜省略)
アプリケーションのデータ保存は、newアクション(生成)とcreateアクション(保存)を組み合わせて実装する。
コントローラーでインスタンス変数を定義しておけば、ビューファイルでそのインスタンス変数が使用できる。
<%= form_with(model: @tweet, local: true) do |form| %>
@tweetの部分が、コントローラーで定義したインスタンス変数。
この記述の仕方で、投稿先のパス、HTTPメソッドを記述する必要が無くなる。
ストロングパラメーター … 指定したキーを持つパラメーターのみを受け取るもの。パスワードの改ざん等、意図しない動作をさせないために制限をする。
requireメソッド … 送信されたパラメーターの持つparamsが使えるメソッド。パラメーターから、どの情報を取得するかを選択する。
permitメソッド … paramsが使えるメソッド。取得したいキーを指定し、キーと値のセットを取得する。
params.require(:モデル名).permit(:キー名, :キー名) と記述することでストロングパラメーターとなる。
プライベートメソッド … クラス外から呼び出せないメソッド。コントローラーに private と記述すると、その行以下はプライベートメソッドとなる。
ストロングパラメーターはプライベートメソッドとして記述しておく。
バリデーション … データを登録する際に、一定の制約をかけること。
・空のデータを投稿させない
・すでに登録されている文字列を登録できないようにする(メールアドレスの重複防止)
・文字数制限をかける(パスワードの文字数など)
バリデーションの設定はモデルファイルを編集。
validates :text, presence: true
これで:textでは空のデータを投稿できないようにする。
ツイートの削除機能はdestroyアクションを使う。
index.html.erbを編集して削除ボタンを投稿一覧に追加。
<%= link_to ‘削除’, “/tweets/#{tweet.id}”, method: :delete %>
(tweetsの中のtweet.idというIDの投稿をDELETEする)
Prefix … ルーティングのURIパターンに名前をつけて変数化させたもの。
root にアクセスしたい場合は “/” と記述していたのを、”root_path” というふうに記述できる。
rootというPrefixに_pathをつけると、URIパターンのパスとして認識される。
上記のツイート削除も、
<%= link_to ‘削除’, tweet_path, method: :delete %>
と記述することができる。
destroyアクションをコントローラーに記述。
:idの値はparamsに格納されて送られる。
def destroy
tweet = Tweet.find(params[:id]) ←テーブルから指定したIDのレコードを取得
end
ツイートの編集
ツイート投稿はnew(新規投稿)→create(保存)だったが、
ツイート編集はedit(編集)→update(更新)で行う。
tweetsコントローラーのeditアクションへのPrefixはedit_tweetなので、指定するべきパスは
edit_tweet_path となる。
コントローラーにeditアクションを追加。
def edit
@tweet = Tweet.find(params[:id]) ←編集したいレコードを取得、@tweetに代入。
end
PATCH(HTTPメソッド)… ブラウザからサーバーに情報を送信し、サーバー内の情報を置き換える。登録情報を更新するなど、サーバー内のデータを更新するために使う。
/tweets/編集するツイートのID にPATCHメソッドでアクセスする。
このパスにアクセスした時に、tweetsコントローラーのupdateアクションが実行されるようにする。
コントローラーにupdateアクションを定義
def update
tweet = Tweet.find(params[:id]) ←指定するレコードの情報を取得、tweetに代入。
tweet.update(tweet_params) ←更新処理
end
ビューファイルのform_withは、新規投稿も編集も形は変わらない。
渡されるインスタンス(@tweet)の中身で、行き先が決まる。
newならcreateへ、editならupdateへ。
ツイートの詳細表示
showアクションを使う。
ルーティングに設定するが、ここまでで7つのアクション全てを使うことになるので、
resources :tweets でよい。(onlyを消す)
コントローラーにshowアクションを定義。
def show
tweet = Tweet.find(params[:id])
end
コントローラー内でtweet = Tweet.find(params[:id])という記述が繰り返されているので、
before_actionを使ってシンプルなコードにする。
before_action … コントローラーで定義されたアクションが実行される前に、共通の処理を行うことができる。
before_action :set_tweet, only: [:edit, :show]
private
def set_tweet
@tweet = Tweet.find(params[:id])
end
こんなところでしょうか。
お昼前後、疲労のせいか集中力がいつもより途切れがちだなーと。
ストロングパラメーターの辺りとか最初全然理解できなくて。
とりあえず先に進んで、昨日の最後にもっかい復習したら、ちょっと分かるかな…くらい。
色んなファイルを跨いで記述をしていくので、どのファイルのどの部分がどれとリンクしてるのか、っていうのをしっかりまとめていくのが大事な気がします。