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' %>

 共通メソッド作って呼び出すだけっていういつも通りの処理だ。