Scaffoldを使わないで〜特定のレコードを指定する機能のアクション実装〜
参考
特定データに関するscaffoldアクションの実装&基礎的なリファクタリング手法 (1/2):開発現場でちゃんと使えるRails 4入門(3) - @IT
今回は前回同様scaffoldの理解!
show、edit、update、deleteアクションを個別で自作
ルーティング設定でresourcesに渡すonlyオプションを外す
resources :users
一応 rake routes で確かめておくこと。
特定のデータを閲覧する「show」アクション
「app/controllers/users_controller.rb」にshowメソッド追加
params[:id]・・・URL中のパラメーターのidの部分にあたる値。
showアクションの結果をビューに表示
showアクションは実行後に「app/views/users/show.html.erb」をレンダリングする。
また、indexアクションのビュー(app/views/users/index.html/erb)にshowアクションへのリンクを持たせるようにする。
ついでにユーザのnewアクションへのリンクも追加しておく。
user_pathなどの「*_path」メソッドは「rake routes」コマンド出力の第一項目を接頭辞としてつけることで、そのURLを生成する名前つきパス。
特定のデータを編集する「edit」アクション
editアクションの実装はshowアクションと同じ。
editアクションの結果をビューに表示
「app/views/users/edit.html.erb」
編集のためのビューではフォームが必要になる。
indexアクションのビューに
editアクションへのリンクを追加忘れないように!!
<td><%= link_to '編集', edit_user_path(user) %></td>
特定のデータを更新する「update」アクション
updateアクションはcreateアクションと少し似てる。
成功 => showアクションにリダイレクト
失敗 => editアクションのビューをリダイレクト
特定のデータを削除する「destroy」アクション
最後くらい説明を。。。
findメソッドでデータ取得
そのモデルオブジェクトのdestroyメソッドを呼ぶ
削除後にはindexアクションにリダイレクト
コーディングで大事な「リファクタリング」をしていこう
before_action:
after_action:
arrond_action
これらの「フィルター」を用いる。
# このメソッドを右の処理を行う直前に行うようにできる。
# つまり今まで @user = User.find(params[:id])と行なっていた部分が全ていらない!!!!!!!!!
before_action :set_user, only: [:show, :edit, :update, :destroy]
共通部分を別の新しいファイルに定義する「部分テンプレート」
ビューにおいて、ユーザの作成と編集はほぼ同じ!
部分テンプレートとして、共通部分を別の新しいファイル
(app/views/users/_form.html.erb)に定義。
この時ファイル名の先頭を「_」にする必要がある。
作成後にnew.htmlとedit.html.erbのフォームの部分をメソッド呼び出しに置き換え
<%= render 'form' %>
共通メソッド作って呼び出すだけっていういつも通りの処理だ。