RubyonRails:検証ツール"validates"他 #Progate #RubyonRails5 V
・validates 検証ツール
Postモデル内に記述
文法:
validates :content, {presence: true}
validates :content, {length: {maximum: 140}}
・if文を使って、成功時と失敗時のアクションを分ける。分岐。
・redirect_to とrenderの違い
redirect_to:HTTPリクエストをサーバーに送り、HTMLをgetする
自サーバー送信時は、routeに繋がる。
render:Action 内で使用。view単体を呼び出すのに使う。
render記述式 render("フォルダ名/ビュー名(拡張子省略)")
・エラーメッセージについて
rubyのエラー表記:変数.errors.full_messages
変数に対してエラー、フルメッセージアクションすることでエラー表記が可能。
・flashメソッド
中に入れたものを一瞬実行する。
<ページ作成>
新規投稿ページ
・validatesを満たさない時、画面を戻しエラーメッセージを表示させる
・validatesを満たさない時、画面を戻し同時に直前の内容を表示する
手順
(省略:画面を戻す)
・post.saveが失敗した時、エラーメッセージを表示する式を書く
・post.saveが失敗した時、直前の内容を表示する式を書く
結果
・エラーメッセージの表示式を書く◯
・直前の内容を表示する式を書く◯
(※ミスポイント:@postに代入したが、textarea内に表示するのを忘れた)
以下、プラス必要な手順
・この状態だとnewルートにアクセスした際@postが空のためエラーになる。
→newアクションに@postを定義
RubyonRails:投稿の編集・削除機能実装 #Progate #RubyonRails5 IV
投稿の編集・削除機能の実装
流れの仮説を立てる
A.編集機能、ページ作成
・編集ページ作成
開いたらテキストエリアに現在のcontentが入る
・投稿ボタンでデータを編集アクションに渡す
・アクション内で前の値呼び出し→新しい値を格納andセーブ
・ルートは個別投稿ページへ。
B.削除機能の実装
・削除ボタン→削除アクションにデータを渡す
・削除アクション内で値を更新(デリートメソッドみたいなの)
・ルートは投稿一覧ページ。
<補足>データベースの更新
データ読み出し→更新→保存
post = Post.find_by(id: ?)
post.content = "新しい文章"
post.save
<補足2>レコードの消し方
データ呼び出し→削除
post = Post.find_by(id: ?)
post.destroy
editアクションで、URLのidと同じidの投稿データをデータベースから取得し、そのcontentの値(=投稿の内容)を初期値に設定する。
def edit
@post = Post.find_by(id: params[:id])
end
<textarea><%= @post.content %></textarea>
※ #{@post.content}はrubyファイル内で使う。
全体の流れ
・投稿編集ページ作成(showビューにリンク挿入)
・フォーム作成
フォームの初期値を現在の投稿内容に
・受け取り、更新機能作成
updateアクションを用意(ルートも。リダイレクトするためビューは不要)
編集完了ボタンの送信先をupdateアクションに設定
<%= form_tag("/posts/#{@post.id}/update) do %><% end %>
・updateアクションの中身を作成
def update
redirect_to("/posts/index")
@post = Post.find_by(id: params[:id])
@post.content = params[:content]
@post.save
end
・textareaにname属性を付与
・投稿削除機能作成
destroyアクション、ルート
showビュー内にリンクを作成 link_to() 、転送方法の指定{method: "post"}
destroyアクションの定義
def destroy
@post = Post.find_by(id: params[:id])
@post.destroy
redirect_to(...)
end
Rails:新規投稿ページの作成から投稿プラグラムまで
投稿一覧と個別投稿ページをリンクさせる。
link_toの使い方
<%= link_to("テキスト", "リンク") %>
・テキスト=post.content
・リンク="posts/#{post.id}"
新規投稿ページの作成
1. 入力フォーム、投稿ボタンづくり
<textarea>と<input type="submit">
inputタグについて
...中身のデータ名と値を指定されたサーバーに指定された方法で送られる(getとかpostとか。 詳しく調べる)
2. 投稿ボタンで送信する機能を付与
・結果を受け取るアクション posts#createを作る
・ルート(post "posts/create" => posts#create)
・アクション作成
・form_tagを使って送信機能を付与
<%= form_tag("送信先URL") do %>(=がないと中身消える)
<% end %>
・投稿ボタンでposts/createに繋げ、posts#createアクション起動
・createアクションで他URLに転送
redirect_to("転送先URL")
データを保存
1. 投稿したものをcreateアクションで受け取る機能
・textareaにname属性を付与(今回引数は"content")
・createアクションにて、params[:content]で送信値を受け取って格納。
paramsは(name属性に設定した)
文字列をキーとしたハッシュになっています。とのこと。Rubyのハッシュ参照
2. データベースで保存する
def create内
・@post = Post.new(content: params[:content])
・@post.save
paramsは2通りの使い方がある
①“「: "リンク名"」を使ったルーティングのURL”から値を取得する
②”「name="データ名"」が付いたフォーム”の入力内容を受け取る
投稿データの並べ替え
・データ取得時に並び替える
・Post.all.order("項目": :asc/:desc)
Rails:“投稿機能をもつWebページ”を作成する
【目標:“投稿機能をもつウェブページ”の作成】
・作るもの① レコードごとの個別投稿ページの作成
(※復習:Railsにおける新規ページ(htmlファイル)作成の手順
ルート設定 → アクション作成 → ビュー作成)
ここでやりたいこと:
"localhost:3000/posts/" + id(1, 2, 3, ... , n)
のURLにアクセスしたとき、idに対応した投稿ページを表示すること
【個別投稿ページの作成】
日本語 訳)
STEP1)1つのidに対し1つのルートを作成【ルート設定】
STEP2)URLからidを取得する式、
取得idのレコードを変数に格納する式
を作成【アクション作成】
STEP3)レコード入り変数のデータをHTML内に表示【ビュー作成】
Ruby語 訳)
(場所:routes.rb)
get "posts/:id" => "posts#show"
(場所:posts_controller.rb)
@post = Post.find_by(id:params[:id])
(場所:show.html.erb)
<%= @post.content %>
Rails:HTML(.erb)の使い方 入門 #Progate
・RailsのHTMLでは"application.html.erb"ファイルに
各ページの共通項をまとめられる。(各HTMLのヘッダー等。)
・application.html.erb
コード"<%= yield %>"
の中に他のHTMLファイルが挿入され、表示される
・ERBでリンクを作成:link_toメソッド
<% link_to("About", "/about") %>
= <a href="/about">About</a>
Rails勉強中:データベースの使い方2 #Progate
データベース:まとまったデータの使い方
・テーブルの全レコードを取得して変数に代入
posts = Post.all
→変数postsの中にレコードが配列で保存される。
実験:全レコードから特定のレコードを取り出す
Ex) Post.all[0] … Postの全レコードの0番目のレコードを取得して表示
Post.all[0].content ... Postの全レコードの0番目のcontent部分を取得して表示
※モデル"model"とは:ApplicationRecordを継承したクラスのこと。
テーブルのレコード(content部分)をHTML"投稿ページ"に一覧表示する。
1.コントローラの編集
2.ビューの編集
・コントローラの編集
postsコントローラのindexアクション内にインスタンス変数をつくり、Postモデルの全レコードを代入する。
・ビューの編集
ビュー>投稿一覧ページに
埋め込みRubyの形(<% %>, <%= %>)で式を挿入。
(HTMLで先に型を作っておくとよい)
<投稿を一覧表示する式>
@posts.each do |post|
(訳:@posts変数から一個取り出し、下記の式に従って変数postに代入して実行。これをレコードの数だけ繰り返す。)
※補足
@posts = ["レコード1", "レコード2", ..., "レコード?"]
@posts[0] = "レコード1"
@posts[1] = "レコード2"
データベースについて
・データベースは、railsアプリケーションフォルダ内のファイルには表示されない
操作は全てターミナル"rails console"内で行う
実験:postsテーブルに新しいレコードを追加してみる
・レコード作成方法おさらい
rails console
post3 = Post.new(content:"新しい投稿")
saveメソッドで保存
post3.save