今日の教科書
IDでデータを検索
IDを指定して検索しデータを取り出す。
コントローラにshowアクションを追加
def show
@msg = "Indexed data."
@data = モデル名.find(params[:id])
end
findメソッド
変数 = モデル名.find(ID):IDを取り出すためのメソッド。引数に入れたIDのデータを取り出す。
返されるデータはモデルクラスのインスタンス。
showテンプレートを作成
routes.rbの追記
get 'コントローラ名/:id', to: 'コントローラ名#show'
:idにしてidを値としてパラメータに渡す。
index.html.erbの修正
showアクションを表示するリンクを用意するために修正。
データの新規作成
新しいデータの作成。フォームを用意して送信し保存する。
addでフォームを表示、送信してcreateで保存、二つのアクションを使う。
addテンプレートの作成
form_tag
とフォームヘルパーを使って、フォームを作成する。
コントローラの作成
モデル.create(項目名:値,...)
:引数にデータの値をセットして、実行すればデータがテーブルに保存される。
リダイレクト
redirect_to アドレス
:直接アドレスを指定してリダイレクトできる。
ルーティングの指定
get 'コントローラ/add' post 'コントローラ/add' , to: 'コントローラ#create'
先のget 'コントローラ名/:id', to: 'コントローラ名#show'
より先に書かないと、
/addにアクセスした際に:idが先に認識され、:id=addと判断される。
変数をルーティングに利用すると、あらゆる変数パターンが:idに行き着く。
なので最後に記述する必要がある、と理解した。参考にした記事↓
https://qiita.com/antena-dmm-daihyou/items/46931ffc56c101fc6a4e
https://qiita.com/gawach/items/4e7460d06f70e3013eea
モデルをフォームに適用
addテンプレートの修正
form_for (モデル, url:{controller: コントローラ, action: アクション})
:引数にモデルのインスタンスを指定して、用意したモデルをフォームにバインドする働きをする。フォームの入力項目にデフォルトでモデルにあるデータが挿入されていたり、送信されたフォーム情報が、そのままモデルとして扱える。
これを利用するとフォーム内に情報が追加されそれがサーバーに送信されて、正しく動作する(らしい)。
コントローラの修正
private
:メソッドのアクセスを制約するためのキーワード。クラスの中からしか呼び出せない。
モデル.create(メソッド)
:メソッドを指定することでメソッドの戻り値が引数に指定されている。
ここには前回、paramsのデータの値を直接使っていた。(params[:@@])
しかし、フォームへルパーを使っている場合だとエラーが起こる。
理由はparamsのパーミッションがないから。
フォームの値をデータベースに保存する際に、正しいかどうか自動でチェックしている。
今回のメソッドはparams.require(:@@).permit(:name, :age, :mail)
。
require
:paramsの中に指定の値があるかどうかチェックしている。:@@があるかどうかチェック。
さらにpermit
:引数に指定されている項目が用意されているかチェックしている。
チェックしたものをcreateに渡して保存。
データの更新
フォームでデータの送信を行う際に、すでにあるデータに扱う。あるデータを書き換えて保存する。
indexテンプレートの修正
editを追加
editテンプレートの作成
HTMLファイルを作って記述。
フォームヘルパーを前回と同様に使っている。
form_for(@person,url:{controller:'people', action:'update', id:@person.id}) do |form|
idの項目が追加されている。form_forで@personオブジェクトを指定しているので、保存してあるデータが既に入っている。
アクションの追加
def edit
@msg = "edit data.[id = " + params[:id] + "]"
@person = Person.find(params[:id])
end
def update
obj = Person.find(params[:id])
obj.update(person_params)
redirect_to '/people'
end
editはGETアクセス、updateはPOST送信。
必ずprivateよりも上にかく。
クラス内部でしか使えなくなるので、アクションを外部から呼び出せなくなる。
editメソッドでは、ID番号をもとにデータを検索してフォームに渡している。
updateメソッドではIDで更新するデータを検索しオブジェクトとして取り出す、
オブジェクトの値を更新する、リダイレクトでトップページに戻る、という作業をしている。
update:paramsを引数にして送られた内容を更新して保存する
ルーティングの追加
ルーティング情報を記述する。
PATCH送信について
「No route matches [PATCH]」のエラーが起こる。
データ更新のためのフォーム送信はPATCH送信のルーティングが必要。
データの削除
deleteアクション
データをモデルのインスタンスで取り出して、destroyメソッドを実効する。
データベースからデータが削除される。
ルーティングの追記
deleteのルーティングを追記。