エラーメッセージを日本語にしよう!

エラーメッセージを日本語表記になおします😁

 

⭐️手順

①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を継承しているカラムにのみ対応可能

class User < ApplicationRecord

今回はFormオブジェクトのカラムに反映させたい!

class PurchaseAddress
include ActiveModel::Model

ActiveModelを使います!

ja:
activerecord: 👈ApplicationRecord
attributes:
user:
nickname: ニックネーム
birthday: 誕生日
last_name: 名字
fast_name: 名前
last_name_kana: 名字(カナ)
fast_name_kana: 名前(カナ)
 
 
activemodel: 👈formオブジェクト ActiveModel 
attributes:
purchase_address:
postalcoad: 郵便番号
prefecture_id: 発送元の地域
city: 市区町村
addresses: 番地
apartment: 建物名
phon_number: 電話番号
token: カード情報

 

これで無事にエラー画面の日本語表記になりました😁

 

🔥ここでまたも問題🔥

郵便番号と発送もとの地域のエラーメッセージがおかしなことになっている!

  • 郵便番号を入力してください
  • 郵便番号is invalid. Include hyphen(-)
  • 発送元の地域can't be blank
  • 市区町村を入力してください
  • 番地を入力してください
  • 電話番号を入力してください
  • 電話番号は不正な値です
  • カード情報を入力してください

 

 

⭐️解決手順

①バリデーションを見にいく

with_options presence: true do
validates :postalcoad,
format: {with: /\A[0-9]{3}-[0-9]{4}\z/,
message: "is invalid. Include hyphen(-)"}
validates :prefecture_id,
numericality: { other_than: 1, message: "can't be blank"}
validates :city
validates :addresses
validates :phon_number, format: {with: /\A\d{10,11}\z/}
validates :user_id
validates :item_id
validates :token
end
 
format: {with: /\A[0-9]{3}-[0-9]{4}\z/,
message: "is invalid. Include hyphen(-)"}
validates :prefecture_id,
numericality: { other_than: 1, message: "can't be blank"}
messageオプションが英語になっている!
 
 
②messageオプションを日本語に直す
validates :postalcoad,
format: {with: /\A[0-9]{3}-[0-9]{4}\z/,
message: "はハイフン(-)を入れて入力してください"}
validates :prefecture_id,
numericality: { other_than: 1, message: "を入力してください"}
 
無事に解決しました!
 
 
 
 
 
 
 
 
 
 
 

 

未ログインユーザーの転送

⭐️タスク

現在、ログインしているユーザーが別のユーザーの編集ページのURLを記入すると編集ページに飛べてしまう😓

トップページに飛ばしたい!

⭐️答えの手前

def edit
@item = Item.find(params[:id])
unless @item.user_id == current_user.id
redirect_to root_path
#editさせない処理
end

 

⭐️答え

class ItemsController < ApplicationController
before_action :authenticate_user!, except: [:index, :show]
before_action :set_item, only: [:show, :edit, :update]
before_action :root_item, only:[:edit, :update]
 

〜省略〜
 
def edit
end
 
def update
if @item.update(item_params)
redirect_to item_path(@item)
else
render :edit
end 
end
private
 
~省略〜 
 
def root_item
unless @item.user_id == current_user.id
redirect_to root_path
end
end

end

  

⭐️チェックポイント

1、編集ページを管轄しているのは、editのコントローラー

2、unless を使って条件分岐 unlessはfalshの時に処理が実行される(if文と逆)

3、#editさせない処理()

4、2、3をupdateアクションにも適用させる

 

⭐️解説

1、編集ページに飛ばせたくないので、編集を管理しているeditコントローラーにその旨を伝える。

 

2、unlessを使う

その商品のユーザーと今操作しているユーザーが一緒じゃない時

unless @item.user_id == current_user.id

トップページに飛ばしてください!

redirect_to root_path

 

3、updateアクションにも適用させたい!

理由→検証ツールなどを用いてリクエストを改ざんすることで、編集画面を経由せずにupdateアクションを動かすことが可能です。  
そういった行為への対策として、updateアクションにもeditアクションと同様の条件分岐を加えることが必要となります。

 

4、新しくメソッドを定義して、before_actionで呼び出す!

 

以上でできました!😁

 

 

 

 

 

presentのメソッドで真偽判定

今回の問題は、商品がなかったらという条件分岐を書きました。その時に使ったのが

<% if @items.blank? %>

でした!

他にも色々使えそうなのがあったので まとめてみました😁!!

 

⭐️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

 

次は間違えないように気をつけよう😁