エラーメッセージを日本語にしよう!
エラーメッセージを日本語表記になおします😁
⭐️手順
①config/application.rbを編集
config.i18n.default_locale = :ja
②Gemfileを編集
gem 'rails-i18'
③config/localesディレクトリにdevise.ja.ymlファイル作成
④devise.ja.ymlサイトの内容を丸ごとコピーして、devise.ja.ymlファイル貼り付け
⑤config/localesディレクトリに、ja.ymlファイル作成
⑥ja.ymlファイルに以下↓記述
例
ja: activerecord: attributes: user: nickname: ニックネーム tweet: text: テキスト image: 画像
🔥ここで注意!
上記はactiverecordを継承しているカラムにのみ対応可能
今回はFormオブジェクトのカラムに反映させたい!
ActiveModelを使います!
これで無事にエラー画面の日本語表記になりました😁
🔥ここでまたも問題🔥
郵便番号と発送もとの地域のエラーメッセージがおかしなことになっている!
⭐️解決手順
①バリデーションを見にいく
未ログインユーザーの転送
⭐️タスク
現在、ログインしているユーザーが別のユーザーの編集ページのURLを記入すると編集ページに飛べてしまう😓
トップページに飛ばしたい!
⭐️答えの手前
⭐️答え
⭐️チェックポイント
1、編集ページを管轄しているのは、editのコントローラー
2、unless を使って条件分岐 unlessはfalshの時に処理が実行される(if文と逆)
3、#editさせない処理()
4、2、3をupdateアクションにも適用させる
⭐️解説
1、編集ページに飛ばせたくないので、編集を管理しているeditコントローラーにその旨を伝える。
2、unlessを使う
その商品のユーザーと今操作しているユーザーが一緒じゃない時、
トップページに飛ばしてください!
3、updateアクションにも適用させたい!
理由→検証ツールなどを用いてリクエストを改ざんすることで、編集画面を経由せずにupdateアクションを動かすことが可能です。
そういった行為への対策として、updateアクションにもeditアクションと同様の条件分岐を加えることが必要となります。
4、新しくメソッドを定義して、before_actionで呼び出す!
以上でできました!😁
presentのメソッドで真偽判定
今回の問題は、商品がなかったらという条件分岐を書きました。その時に使ったのが
でした!
他にも色々使えそうなのがあったので まとめてみました😁!!
⭐️nil?メソッド
変数.nil?
このメソッドでtrueが返ってくる時はレシーバーである変数そのものが存在しない時ということになる。
⭐️empty?メソッド
変数.empty?
このメソッドでtrueが返ってくる時はレシーバーである変数に値が入っていない時ということになる。
例えばその変数がインスタンス変数であればそのインスタンス変数自体は存在するが、そのインスタンス変数に値が何も入っていない時などは、empty?メソッド使って検索することとなる。
⭐️blank?メソッド
変数.blank?
このメソッドでtrueが返ってくる時はレシーバである変数そのものが存在しないか、変数に値が入っていない時とということになる。
つまり、上記のnil?メソッドとempty?メソッドの両方の機能を足したメソッドとなります。
⭐️present?メソッド
変数.present?
present?メソッドはレシーバーである変数に値が入っていればtrueを返し値が入ってなくまたレシーバーである変数そのものが存在しない時は、falseを返します。
上記のメソッドのblank?メソッドの逆となる。
ActionView::Template::Error (undefined method `errors' for nil:NilClass):について
⭐️エラーがでた経緯
ログイン画面から出品投稿画面に遷移する時
⭐️エラー画面
AActionView::Template::Error (undefined method `errors' for nil:NilClass):
1: <% if model.errors.any? %>
2: <div class="error-alert">
3: <ul>
4: <% model.errors.full_messages.each do |message| %>
app/views/shared/_error_messages.html.erb:1
app/views/items/new.html.erb:9
app/views/items/new.html.erb:8
⭐️チェック箇所
app/views/shared/_error_messages.html.erb:1
app/views/items/new.html.erb:9
app/views/items/new.html.erb:8
⭐️解決ポイント
情報の渡し忘れ
情報がどのように渡されていくのかイメージする
⭐️解決コード
new.html.erb:8
<%= form_with local: true do |f| %>を、
<%= form_with model:@item local: true do |f| %>にする
⭐️解決経緯
今回エラーがでたのはバリデーションによって保存できない場合、
エラーハンドリングをおこないます。
そのためエラーが付与されている情報を渡してあげる。
カラムの種類
カラム一覧表
・primary_key:プライマリキー
・string:文字列(1〜255文字)
・text:長い文字列(1〜4294967296文字)
・integer:整数(4バイト)(active_hashで実装予定の場合にも、使う)
・bigint:整数(8バイト)
・float:浮動小数
・decimal:精度の高い少数
・numeric:数値
・datetime:日時
・timestamp:更新時間
・time:時間
・date:日付 (誕生日、年、月、日まとめて取得) t.date :birthday, null: false
・binary:バイナリーデータ
・boolean:真偽値
今回学んだこと
・string:文字列(1〜255文字)
主に名前やアドレスなどのカラムに書いていたので、短い文数の時に使うと思っていたら、255文字対応で結構長い文数対応しているんだなと思いました😁
・integer:整数(4バイト)
active_hashで実装予定の場合に使えることを知りました。
・date:日付 (誕生日、年、月、日まとめて取得)
実装参考のフォーマットが年、月、日でわかれていたので、
別々に記述しましたがまとめてdateで取得できると知りました😁
次回はばっちりスムーズに取り組めそうです!!
deviseの導入直後のエラー
devise導入して、rails db:migrateしたらすぐにエラーが出ました😭
NoMethodError: undefined method `devise' for User (call 'User.connection' to establish a connection
訳:deviceメソッドが見つからないよ~
ターミナルで調べてみると…
rails g devise:installをしていない!!
対処方法
①routes.rbにあるdevise_for :users
というコードを削除する
②rake db:rollback
でマイグレーションファイルをロールバックする。
③userテーブルを作ったときのマイグレーションファイルを削除する。
④rails d model user
を行いuserモデルを削除する。
これらの作業でdeviseをインストールする前の状態に戻ることができました。
以上の作業が終わったら、rails g devise:install
からコマンドを実行していけば正常に動いた!!
正しい手順
① gem 'davise' 記述する
② bundle install
③ rails s
④ rails g devise:install
⑤ rails g devise user
⑥ マイグレーションファイル記述
⑦ rails db:migrate
⑧ rails db:migrate:status
次は間違えないように気をつけよう😁