どうも、nus4です。
Rails講座の学習メモ4回目です。
今回は梅雨の時期に取り組んでいるのですが、
自分は低気圧に弱く、時々頭がぼーっとしながら苦心しています…
学習方法
- Progate Ruby on Rails5コース Ⅳ〜Ⅴ
(Ruby学習に引き続き、愛用させてもらってます!)
📝 目次
レコードの削除
インスタンス名.destroy
.saveメソッドは不要です。
レコードの更新
インスタンス名.update(カラム名: 値)
カラムと値は","で複数指定することが可能です。
postアクションへのリンクの書き方
<%= link_to("画面表示名", "/リンク先URL",{method:"post"}) %>
{method:"post"}がないと、routesではgetアクションを探してしまうため、追記が必要です。
エラー条件の作成(バリデーション)
モデルファイルに上記を記載することで、
各条件に合致するデータベースへの変更を弾きます。
#変更は起こらず、インスタンス名.save = falseになる状態
# modelファイル
# 空の値をデータベースに追加する場合、エラー
validates :検証するカラム名, presence: true
# 141文字以上の値をデータベースに追加する場合、エラー
validates :検証するカラム名, length: {maximum: 140}
# 上記2つのエラーを一行で書く
validates :検証するカラム名, presence: true, length: {maximum: 140}
# 追加する値が既に存在している場合、エラー
validates :検証するカラム名, uniqueness: true
実行エラーにはならないので、処理自体は止まらず続きます。
逆に、エラー条件に合致した場合の処理を追加したい場合は
controllerファイル内で if インスタンス名.save = false と書けばいいわけです。
別のアクションを経由せずに直接ビューを表示
アクション中に別のviewに飛ばしたいが、それ用にアクションを追加したくない場合、
renderメソッドを使用してviewファイルを直接指定することが可能です。
# controllerファイル アクション内
render("コントローラ名/ビュー名")
redirect_toメソッドと違い、viewファイルを直接指定するので、()内の頭に"/"が不要なことに注意。
また、同アクション内で定義した@変数を指定したviewファイル内でも使用できるのでそこも便利です。
エラーメッセージの表示
railsではバリデーションに失敗した場合、自動でメッセージが生成されるようになっています。
メッセージはインスタンス名.errors.full_messagesに配列として格納されていますので、
配列の値を取り出すことで、エラーメッセージを表示することができます。
<!-- viewファイル -->
<% @インスタンス名.errors.full_messages.each do |変数名| %>
<%= 変数名 %>
<% end %>
配列なので、エラーメッセージを複数蓄積することも可能ですが、
アクションのたびにインスタンスを作成するように記述されていれば、
処理時のエラーメッセージ以外はリセットされるため、表示されません。
エラーメッセージの表示(自作メッセージ)
自作メッセージを表示させたい場合は、下記のようになります。
# controllerファイル
def アクション名
if エラー条件
@変数名 = "メッセージ"
end
end
<!-- viewファイル -->
<%= @変数名 %>
サクセスメッセージの表示
反対に、サクセスメッセージを表示させることも可能です。
ページ上に一度だけ表示させる"フラッシュ"というメッセージを、
railsで用意されている特殊変数"flash[:notice]"で用意することができます。
# controllerファイル
flash[:notice] = "表示させたい文字列"
<% if flash[:notice] %>
<div class="flash">
<%= flash[:notice] %>
</div>
<% end %>
flashは@がついていませんが、ビュー内で使用することができる特殊な変数です。
色々なページで表示させたいことが多いので、application.html.erbにまとめて記載したほうがいいです。
いかがでしたでしょうか。
Progateの有料プランは1ヶ月のみの契約のつもりでしたが、自分の進捗がゆっくり過ぎて2ヶ月目に突入していました…。
3ヶ月以内に目標完了目処でこれからも無理せず進めたいと思います。