日記帳

プログラミングのことをつぶやく日記です。

Rails初心者がもっと早く知りたかったこと

元記事は自分がQiitaであげた記事

qiita.com

Rails初心者がもっと早く知りたかったこと

スペック

・現PHPエンジニア(1年弱)

Railsエンジニア転向のため、TechAcademyのRails講座を1ヶ月受講

・現在Railsで個人開発中

・個人開発でわからないことが続出、調べながら何とか進めています。

タイムゾーン設定

APIを叩いて外部サービスの時刻を取得するのだが、日本のタイムゾーン(JST)ではなく、UTC(協定世界時)で取得するので、困った。 結論として、config/application.rbにタイムゾーンの設定を書く。

require_relative 'boot'

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
Bundler.require(*Rails.groups)

module Typetalks
  class Application < Rails::Application
    config.time_zone = 'Tokyo'
  end
end

UTC => JSTに変換するときは、下記のよう"in_time_zone"関数を使う。

date = "2017-05-18T04:07:54Z"
p data                #2017-05-18T04:07:54Z
p data.in_time_zone   #Thu, 18 May 2017 13:07:54 JST +09:00

DBの初期化

開発環境でDBを初期化してやり直したい時がある。 そういうときは以下のコマンドを実行する。

$ rails db:reset
  1. 全てのテーブルを drop
  2. "db/schema.rb" を元にテーブルを再作成

ケースによってはmigrateファイルからテーブル作成を行いたい場合もあるだろう。 そのような場合は下記のコマンドを実行する。

$rails db:migrate:reset
  1. 全てのテーブルを drop
  2. "db/migrate/" 以下の全ての migration を実行してテーブルを再作成

requireするライブラリファイルの記述箇所

最初はcontrollerやmodelの先頭に書いていたが、何回も同じことを書くのは面倒なので、 config/initializers/stdlibs.rbで一括管理する。

require 'net/https'
require 'uri'
require 'json'
require 'time'

参考資料

RailsでDBをリセットして最初からつくり直す [俺の備忘録]

ブランチ間の差分の取り方

元記事は自分がQiitaに書いたもの

qiita.com

【git】ブランチ間の差分の取り方

ブランチ間の差分を見たい

$ git diff [ブランチ名A] [ブランチ名B]

使用例

$ git diff master develop 

ブランチAの方がBより古い扱いで差分が表示される。

リモートブランチとの比較

$ git diff origin/dvelop fix_routes

リモートブランチのdevelopとローカルのfix_routesを比較する。

更新行数を取得

$ git diff master develop --shortstat
 7 files changed, 502 insertions(+), 1 deletion(-)

オプション"--shortstat"をつけると、ブランチ間の更新行数を比較できる。

更新がかかったファイルの名前のみを表示する

--name-onlyオプションを使用する。

$ git diff --name-only

PHPUnitの導入方法メモ

今更ながら、一番簡素なPHPUnitの導入メモ
ちなみに参考資料は「PHP逆引きレシピ 第2版」です。

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

PHP逆引きレシピ 第2版 (PROGRAMMER’S RECiPE)

ルートディレクトリにcomposer.jsonを以下のような内容で配置。
参考資料ではdbunitphpunit-seleniumの説明なしにいきなりサンプルコードが記載されいているが、
よくわからないまま進むのも気持ち悪いので、少し補完。

dbunitは、テスト用のDBを作成してくれるツール。

phpunit-seleniumはブラウザテストのツール
PHPでブラウザテストの自動化! Facebookの作ったツール「php-webdriver」で人生がときめく (サンプルコード付き) - コネヒト開発者ブログ


composer.json

{
  "require-dev": {
    "phpunit/phpunit": "3.7.*",
    "phpunit/dbunit": ">=1.2",
    "phpunit/phpunit-selenium": ">=1.2"
  }
}
$ composer install

テストされるclass
lib/User.php

<?php
class User
{
    public $name;

    public function __construct($name)
    {
        $this->name = $name;
    }

    public function createMessage()
    {
        return "こんにちは、{$this->name}さん!";
    }
}

テスト実行class
UserTest.php

<?php
require_once __DIR__ . 'lib/User.php';

// "PHPUnit_Framework_TestCase"を継承してテスト用のクラスを作成
class UserTest extends PHPUnit_Framework_TestCase
{

 // User->nameが佐藤になっているか確認するテスト
    public function testVar()
    {
   // Userインスタンス生成
        $user = new User('佐藤');
        // $user->nameが'佐藤'とイコールか確認する。
        $this->assertEquals('佐藤', $user->name);
    }

    public function testメッセージ作成() //エラーメッセージがわかりやすいように関数名を日本語にした。
    {
        $user = new User('河合');
        $test = $user->createMessage();
        $expected = 'こんにちは、河合さん!';
        // $createMessage();の結果が、'こんにちは、河合さん'になってるか確認する
        $this->assertEquals($expected, $test);
    }
}

実行

$ ./vendor/bin/phpunit UserTest.php ]
/work/www/src/lib/User.phpPHPUnit 3.7.38 by Sebastian Bergmann.

Time: 432 ms, Memory: 3.25MB

仮に「testメッセージ作成」関数が失敗した場合、下記が出力される。

There was 1 failure:

1) UserTest::testメッセージ作成
Failed asserting that two strings are equal.
--- Expected
+++ Actual
@@ @@
-'こんにちは、河合さん!'
+'こんにちは、さん!'

/work/www/src/UserTest.php:26

FAILURES!
Tests: 2, Assertions: 2, Failures: 1.

このように、functionの名前は日本語で記述したほうがわかりやすい場合もある
.F <------ "."は成功、"F"はFail(失敗)"E"はPHPError