TECH CAMP 11日目 ストロングな

自分用のアウトプット。

ページ作成は
ルーティング → コントローラー → モデル → ビュー
が基本的な流れ。
(本記事内ではルーティングの設定は適宜省略)

アプリケーションのデータ保存は、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

こんなところでしょうか。
お昼前後、疲労のせいか集中力がいつもより途切れがちだなーと。
ストロングパラメーターの辺りとか最初全然理解できなくて。
とりあえず先に進んで、昨日の最後にもっかい復習したら、ちょっと分かるかな…くらい。
色んなファイルを跨いで記述をしていくので、どのファイルのどの部分がどれとリンクしてるのか、っていうのをしっかりまとめていくのが大事な気がします。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする