【Rails】showアクション
7つのアクション、最後の一つshowアクションについて
見ていきましょう。
これは詳細を表示する機能ですね。
こちらも削除や編集と同じように投稿データごとに管理する必要があります。
idが1の詳細画面は、/posts/1 のようなパスになります。
いつも通りのルーティングが終われば、詳細ボタンを追加しましょう。
index.html.erb の編集ですね。
削除や編集の時と完全に同じです。
<%= link_to '詳細' , tweet_path ( tweet.id ) , method: : get %>
HTTPメソッドは表示するためのgetを使用します。
これ、削除のパスと詳細のパスが同じなんです。
なのでHTTPメソッドで見分けています。(削除の際はdelete)
次にshowアクションを定義します。
def show
@post = Post . find( params[ : id ])
end
もうお手のもんですね!
あとは詳細ページのビューを作成します。
これで完成です。
【Rails】editアクション・updateアクションの使い方
今回は投稿を編集する方法をご紹介いたします。
編集に使用するアクションは7つのうち、
editアクションとupdateアクションの2つです。
ではどんな作業か必要か考えてみましょう。
まずは編集画面へのルーティング。
そしてindexページに編集ボタンを追加、
editアクションをコントローラーに定義、
そして編集ページの作成(フォーム作成)。
次に更新を行うためのルーティング、
updateコントローラーを定義、
編集完了画面のビュー作成。
こんなもんでしょうか。
ルーティングに関してはもう大丈夫かと思うので説明を省きます。
ちなみに編集した情報を送信する際に使用するHTTPメソッドはPATCHです。
こちらは覚えておきましょう!
では、editアクションの定義からいきましょう。
編集→更新の流れは
新規投稿作成→投稿(保存)の流れととても似ています。
異なる点は、元々あるデータを紐付ける必要があるという点です。
編集前のデータを引継ぎ、そこから編集→更新を行います。
ではどのように紐づけるか、
削除機能の実装で学んだ( params[ : id ] )がまた活躍します
def edit
@post = Post . find ( params[ : id ] )
end
ここで注目すべきはインスタンス変数を用いてること!
なぜかお分かりでしょうか。
そもそもコントローラーでインスタンス変数を定義するのは
なんのためだったでしょうか。
ビューファイルに受け渡すためです。
どういうことかというと、idの情報を持った@postは
ビューファイルで記述することによって、
@post(編集前のデータ)の中身を表示させることができるのです。
便利ですね!!
ではビューファイルを作成しましょう。
今回は編集するためのフォームが必要です。
さらに、編集前のデータを含んだフォームが必要です。→@postを使いましょう。
form_withメソッドの便利な使い方を覚えてますか??
modelオプションを使ってパスを指定する方法です。
今回もこれを使っていきましょう。
<%= form_with ( model: @post , local: true ) do | form | %>
この@postには何が含まれてるか分かりますよね、
さっきコントローラーで定義した
@post = Post . find ( params[ : id ] ) 、
つまり編集前の情報です。
実はnewアクションで同じ見た目のインスタンス変数を定義しているの、
覚えてますか?
def new
@post = Post . new
end
ですね。
この二つの大きな違いは@postに中身が入った状態かどうか
ということです。
これはform_withメソッドが
インスタンス変数の中身次第で次の処理が
createアクションなのか、updateアクションなのか
振り分けてくれるんです。
中身が何もなければ保存、中身にすでにデータが入った状態であれば更新、
となります。頭いいですね!
これで編集画面はできました!
次に更新処理を実装します。(updateアクション)
こちらも元々のデータに上書きをするので、
テーブルと結びつける必要があります。
でももうやり方は大丈夫ですよね!
def update
post = Post . find( params[ : id ] )
post . update (post_params)
end
こうなります。
(post_params) は createアクションの時と同様で、
ストロングパラメーターを引数に持ってきているものです。
保存・更新をするときにはストロングパラメーターで、
取得するキーを指定しましょう。
あとは編集完了画面を編集して完了です!
【Rails】destroyアクションの使い方/特定のデータを削除する方法
今回は削除機能を実装していきたいと思います。
削除を行うためにはdestroyアクションを利用するのでしたね。
ルーティングするためにresources に :destroy を追加します。
そして削除ボタンを作成します。
どこに表示させるか、
投稿の一覧ページであれば index.html.erbですね。
ここで一つ一つの投稿ごとに削除できるようにすることが必要なので、
どの投稿を削除するか区別する必要があります。
その場合、投稿のidで区別しましょう。
テーブルと連携させます。
そのために、リンクを作成するためのlink_toメソッドには
このように記述しましょう。
<%= link_to '削除' , post _path (post.id ) , method : : delete %>
肝は完全にこれですね。
post_path ( post.id )
このようなパスにするとパラメーターとして
( post.id )の中身を受け取ることができるのです。
このidはモデル名.idで指定します。
モデルを指定すればどのテーブルから取り出せばいいか分かりますからね。
またこの部分にも注目しましょう。
post_path
これ、パスを指定しているのですが、
URIパターンではなくPrefix を用いています。
これはURIパターンが変数化したもので、rails routesを実行すると確認できます。
実際に確認してみるとdestroyアクションに対応するPrefixは
postとなっているはずです。
そしてPrefixは _path とつけてあげることで
URIパターンのパスとして認識されます。
ではようやくコントローラーにdestroyアクションを定義しましょう。
想像つく範囲として何を記載する必要があるかというと、
・もちろんdestroyメソッドの定義
・どのツイートを削除するのか特定するための記述
こんなところですかね。
それでは記述をみていきましょう。
def destroy
post = Post . find ( params [ : id ] )
post.destroy
end
こうなります。みていきましょう。
まずパラメーターで受け取った( params [ : id ] )を元に
削除するデータをfindメソッドを使って取得します。
findメソッドはモデルで使用できるメソッドなので、モデル名.findとしましょう。
そしてそのデータをdestroyメソッドを使って実際に削除します。
例えば、 post = Post . find ( 3 )
と入力したらpostsテーブルの3番目のデータが削除されます。
なのでルーティングで使用したpost.idと、
コントローラーで使用する params [ : id ] は
同じidが入ります。
idが3であればどちらに入るのも3です。
コントローラーに届く際にはparamsの箱に入れられて届くので
このように示しているだけです。
これで削除機能の実装は完了しました!
あとはビューですね。
削除完了画面があれば完璧です。
destroy.html.erbファイルを編集しましょう。
【Rails】バリデーションの設定
今回はデータの入力の際に制約をかける方法を説明します。
このことをバリデーションといいます。
このバリデーションを設ける場合には
モデルにvalidatesメソッドを記述します。
validates :text, presence: true
これはtextが空欄だったら保存できないようになってます。
presence: trueと記述することで、
textカラムが「空ではないか」というバリデーションを設けてます。
こういった形で制限を設けられることを覚えておきましょう。
【Rails】ストロングパラメーター/プライベートメソッド
ここではデータを保存する際に使用する機能、
ストロングパラメーターを紹介します。
強そうな名前ですね。
これは何かというと、
簡単にいうと「指定したキーをもつパラメーターだけを受け取るよう制限する」
ということです。
これ、制限しないと意図しないデータも更新されたりするのです。
他の人のパスワードを変更するパラメーターを送信すると
勝手に変更できてしまったり。これを防ぐためのものです。
このストロングパラメーターを使ってどのパラメーターを取得するか
指定するには、requireメソッドとpermitメソッドを使用します。
こうなります。
params . require ( : モデル名 ). permit ( : キー名, : キー名)
permitメソッドではキーを指定することができて、
その指定したキーと値をセットで取得します。
これではわかりにくいので、実際に値を入れてみましょう。
params . require ( : Post ). permit ( : image, : text)
これ通訳すると、
「paramsの箱から、postsテーブルのimageとtextのデータだけ取得するよ!」
となります。
Postモデルに紐づくのはpostsテーブルですよね。
requireメソッドのみを指定すると、
paramsに入ってる値はリクエストの内容によって様々です。
そこでpermitメソッドを使ってカラムに保存したいデータのみに絞りましょう。
そしてこれらの記述をメソッドとして定義しますが、
これまでとは違うプライベートメソッドとして定義します。
これはクラス外から呼び出すことができないメソッドのことです。
これを使う理由は2つ
①Class外から呼ばれたら困るメソッドを隔離
→エラーを起こすメソッドを予め隔離してエラーを防ぐ。
②可続性
→Class外から呼び出されたメソッドを探すときに、目を通さずに済むようになる。
では実際に定義してみましょう。
今回はデータを保存するときに使用するのでcreateメソッドを使用します。
def create
Post.create( post_params )
ここでプライベートメソッドに記載した内容を呼び出します。
end
private
def post_params
params. require( : post ). permit ( :name, :image, :text )
end
これでpost_paramsというストロングパラメーターを定義して
createメソッドの引数に使用しpostsテーブルに保存できるようにました。
このようにしてデータの保存の際には
ストロングパラメーターとプライベートメソッドを使って保存するデータを制限しましょう。
【Rails】form_withのちょっと便利な使い方
以前紹介したフォームの作成で使用したform_withメソッドですが、
もっと便利な使い方を発見したのでこちらに書いていこうと思います。
以前紹介した際の記載の仕方は
<%= form_with url : "/posts" , method: :post , local : true do |form| %>
でした。
この時わざわざurlを指定したり
methodでHTTPパスを指定しなければいけなかったのですが、
modelオプションとやらを使うと、これがもっと簡単になるんです。
このmodelの引数に、インスタンス変数をもってくるのです。
どこから?
コントローラーのnewアクション(生成)を定義したときに、
インスタンス変数も定義しておくのです。
コントローラーで定義したインスタンス変数はビューファイルに
引っ張ってこれるので。
(routes.rb)
def index
@Posts = Post.all
end
def new
@post = Post.new(postの生成)
end
こんな感じで。
単数形なのはおそらく新規投稿されるpostは一つだから、
だと思ってます。
真相を知ってる方は教えてください。
modelオプションの話に戻りましょう。
なのでmodelの引数には@postを持ってきます。
<%= form_with (model: @post , local: true) do |form| %>
これで投稿ページにいきたい!というリクエストに対して
パスとしてnewアクションが指定され、new.html.erbへ遷移する処理が行われます。
以上、form_withのより便利な使い方でした。
【Rails】resourcesメソッド
今回はルーティングの設定の際にとても便利な機能を紹介します。
まずはこの概念から。
これはアプリケーションのデータ関連に関する、
基本的な処理の頭文字を並べたものです。
Create、Read、Update、Delete
生成、読み取り、更新、削除です。
そしてこれらの処理を行う時は
CRUDを7つのアクションに分割します。
index(一覧表示)
show(詳細表示)
new (生成)
create(保存)
edit (編集)
update(更新)
destroy(削除)
どれもデータの管理に必要そうな単語ですよね。
そしてこれらをまとめて、
resourcesメソッドとして使用することができるのです!
このresourcesメソッドを使用してルーティングする際には
引数にルーティング先のコントローラー名(パス)を記載します。
なのでPostコントローラーへのルーティングであれば、
resources : Posts
となります。シンボルを忘れずに!
今回は7つのアクション全て使用する場合でしたが、
7つの中から選んで使用することもできます。
その際に使用するのが
onlyオプションです。
これは簡単でonlyで指定してあげればいいのです。
resources : Posts, only: :index
といった感じでOK。
そしたらコントローラーを作成して
indexアクションを定義してあげましょう。
こうしなければindexアクションが実行されることがないので。
以上がとても便利なresourcesメソッドの紹介でした!