PHPにおいての配列の書き方を学習しました。そのアウトプットです。 まず配列を定義する為に下記のような書き方をする。

$colors = array('赤','青','黄');

続いて出力についてですが、

echo $colors[];
 =>赤青黄

で出力出来ますが、個別で取り出す際はインデックス番号を[]の中に記入する。(0から始まるので、赤だったら[0]と書く)

echo $colors[0];
 =>

配列に値を追加する際は下記のように書く。

$colors []='白' //最後尾に追加
  =>赤青黄白;
$colors[1]='白'  //引数のインデックス番号の値に上書き
 =>赤白黄;

またキー=>値のように書く連想配列(ハッシュ)は下記のように記入する。

$score = array(
               '数学'=>70,  //コンマ忘れずに!
               '英語'=>80,
               '国語'=>90
)

連想配列rubyとかは{}で囲っていたので、phpでは()であることに注意。最初間違えてしまった。 また連想配列の値を追加・変更する場合は

 $score['理科']=60  //追加は[]は新規のキーを記入する
 $score['国語']=85  //変更は[]に既存のキーを記入する

ifはrubyjavascriptとそんな大きな違いが無いように思ましたが、配列と連想配列は若干違いがあるかなと思いました。 {}では無いこととかarray()のarrayとか(これは必ずarrayなのか…?調べてみます)初めは戸惑いましたが慣れていきたいと思います。

PHP 学習開始!

PHPもまた新しく勉強しようと思う今日この頃。 なので早速少し触れてみました。

PHPはHTMLに埋め込んで使うことが出来る。 文字の出力については、echo+半角スペースクォーテーションで囲んで文字列で出力する。 数値はクォーテーションで囲まない。そして文末には;(セミコロン)をつける。

echo "hallo world!";

変数の定義には$を先頭につけて変数名=変数で定義する。

$name = "タロウ";

変数名は数字から始めてはいけないことや誰が見てもわかるような変数名にすること、 2文字以上連結する場合はキャメルケースを使うことなどなど。

文字列の中で変数を使うことを式展開といいますが、やり方は使う変数に{}で囲むだけ、 ちなみにこの際ダブルクォーテーションでないと反応しない点に注意が必要。

とりあえず今日はここまで、 基本的にはrubyとそこまで大きく変わらないかなと思いました。 でも文末に;をつけたり、変数宣言の際に$をつけたりするのを忘れそうと思いました。 続きはまた明日やりたいと思います。

if else問題

正の整数を入力します。その整数が、10の倍数(10,20,30...)からの差が2以内であるときはTrue、それ以外はFalseと出力するメソッドを作る。という問題について。 まずはメソッドを定義する。

 def near_ten(num)
 end

そのメソッドの中で10の倍数を変数に代入する。つまりnum%10を代入する。

 quotient = num % 10

次に条件分岐で変数quotientが10±2以内ならTrueを返し、それ以外ならfalseを返す条件式を定義する。

 if  quotient <= 2 || quotient >= 8 #quotientが2以内もしくは8以上ならばtrue
 puts "True"
else
 puts "False"
end

これで渡した値が10の倍数からの差が2以内ならばtrueを返し、それ以外であればfalseを返すメソッドを定義出来た。フルで書くとこんな感じ。

def near_ten(num)
  quotient = num % 10
 if quotient <= 2 || quotient >= 8
  puts "True"
 else
  puts "False"
 end
end

初見で見たら複雑なことだと思い間違えてしまったが、蓋を開けてみると単純でした。 もっと柔軟に考えれるようになりたい…

今日の学びをアウトプット。

image_tagで出力しようと思ってもどうにもエラーになってしまう。

 = image_tag @image.url,class:"Image"

なぜだろうといろいろと検索をした結果、下記のようなコードで出力出来ました。

 = image_tag @image.url.to_s,class:"Image"

なるほどto.sをつけるんですね。文字列に変換しているってことかな? 普通に画像を出力するのとは違うので勉強になりました。

FizzBuzz問題

1〜100までの数字をターミナルに出力してください。ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力してください。という問題について独自解釈です。

def fizz_buzz(num)
 num = 1
 while  (1<=100) do
   if (num%3==0) && (num%5==0)
    puts "FizzBuzz"
  elsif num%3==0
   puts "Fizz"
  elsif num%5==0
   puts "Buzz"
  else
   puts num
  end
 num += 1
 end
end

fizz_buzz

まず変数numを定義して、100回まで繰り返すためにwhileを使って繰り返し文を書く。

 while1<=100do
 処理〜
 num +=1
 end

whileの引数は条件式が入るのですが、今回は1回から100回繰り返したいので100回まで繰り返す条件を記入します。 処理後にカウントを1増やすためnum+=1を書きます。

次にwhile文の中にif文を記入します。まず15の倍数は"FizzBuzz"と出力するというところから書きます。 書き方は(num%3==0) && (num%5==0)と書くが、これは変数numの値を3または5で割った余りが0と同じ(倍数)という感じです。 続いて同様に3の倍数のみの場合、5の倍数のみの場合の条件式を書き、最後に条件に当てはまらなければ変数numを出力する。 というif文を記入します。ちなみに15の倍数は一番上に書く事、3の倍数(または5の倍数)の下に書くと15の倍数でもFizzが出力されてしまうので注意が必要です。自分はこの順番をよく間違えてしまうので気をつけなければと思います。

日本語化 rails-i18nについて

enumの表示を日本語化した時の実装手順についての備忘録…

まずはenumを日本語に変換する為のgemをgemfileに入力する。

gem 'rails-i18n'
gem 'enum_help'

次はconfigディレクトリのlocalsの中にja.ymlがあるはずなのでそこを編集する。 こんな感じ。階層構造をきちんとしないと日本語化しないようなので気を付ける。

ja:
 enums:
  items: #テーブル名
   trading_status: #カラムみたいな感じ
     AlreadyDelivered: "配送済み"
      InTransit: "輸送中"
      InDelivery: "配達中"
      Delivered: "配達済み"
      InVestigating: "調査中"

あと文字列はきちんとダブルクォーテションで囲まないといけない。よく忘れるからなぁ

あとrails-i18nってエラーメッセージもいきなり日本語になるんすね〜今更ながら知りました 昨日までOKだったテストが急に失敗してびっくりした笑

rspec factorybotの外部キーの書き方について

今日rspecについて学んだことを備忘録として書き留めます。 テストを実行する際にfactorybotで定義した外部キー(今回はseller_idとcategory_id)について、ちゃんと値としては入っているぽいけど値がありません。必ず必要です。ってエラーが出てしまう。こんな感じ。

 to be valid, but got errors: Seller must exist, Category must exist

binding.pryでitem = build(:item)を見ると、

略
 category_id: 1,
 trading_status: "InTransit",
 buyer_id: nil,
 seller_id: 1,
略

見かけじょうは入っているような気もする。メンターさんに聞いてみると、seller_id:1の中身が入っていないとのこと。中身を見てみると…

User.all 
   => []

確かに入っていない。なので、先にuserのデータを作成しないといけないみたい。 binding.pryしてターミナル上で先に中身のデータを作成してから、テストを実行したらエラー解決を確認しました。ちなみにcategoryも同じです。

FactoryBot.create(:category)
FactoryBot.create(:user)
exit  #OK!!

rspec.rbのファイルではbefore_actionで先に定義をするかfactorybotで定義する。 今回はfactorybotでこんな感じで書いたらいけました。

 category_id { FactoryBot.create(:category).id }
 seller_id { FactoryBot.create(:user).id }   

メンターさんは.idがなくても問題ないって言ってたけどなかったらエラーになってしまった…なにか間違えているのだろうか… とりあえず上のように書いたらテストはパスしたのでヨシっていうことで笑

結論

外部キーをfactorybotで渡す際は一緒に相手のデータも作ってあげましょう。と言うこと。 勉強になりました。