LoginSignup
1
0

More than 3 years have passed since last update.

アプリ開発実践入門8 Modelとデータベース CRUD

Posted at

今日の教科書

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のルーティングを追記。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0