16日目
今日の学習
Ruby
こちらの本で学習。今後、当ブログではRuby本といえばこの本を指すことにする。
第2章の、Rubyの基礎を理解するという章を読み進めているが、小ネタ集を見ているような気分になるほど、知らない知識だらけで驚いた。
メソッド呼び出しの表記
オブジェクトの内容を文字列化するメソッドであるto_sメソッド
。
1.to_s #-> "1"
今まで、引数がない場合はこのように記述をしてきたが、
1.to_s() #-> "1"
このように、かっこがついていても同じような意味合いを持つ。
JavaScriptの学習時に、引数を渡さない場合もかっこを書いていたが、Rubyは単純にかっこが省略できるだけのようだ。
また、かっこの中に引数を入れる形が馴染み深いが、
オブジェクト.メソッド(引数)
オブジェクト.メソッド 引数
引数をかっこに入れていなくても良いということを初めて知った。
かっこに入れる方が分かりやすいし、いまだに後者の書き方を見かけたことはないので、超重要な知識ではないかもしれないが、頭の片隅にしっかり入れておきたい。
数値には_
を含めることができる
price = 10000000 #ぱっと見では位が分かりにくいが、_を含めることで区切ることができる price = 10_000_000 #_は無視される
戻り値
Rubyでは、最後に評価された式がメソッドの戻り値になるという特徴がある。
他の言語では、return
と書いて戻り値が出てくるようにしていたのだが、Rubyだとそれがないため、いまいち戻り値の概念をしっかり理解できていないように思う。
プログラムにおける「評価」という単語も、やや理解が難しい。入力された値の計算結果という認識で合っているだろうか。
テストの自動化
プログラムを作動させて、期待通りの出力をしているかどうか、実行結果を自動でチェックしてくれる機能。
Minitestを利用したテストの自動化を学習した。
テスト用のコードファイルを作成し、require
を使用してMinitestを利用する。
Minitestが提供しているassert_equal
メソッドをはじめとした、様々な検証メソッドを用いて、期待する結果とテスト対象になるものを比較する。
有名なFizzBuzzで検証をすると、
require 'minitest/autorun' class FizzBuzzTest < Minitest::FileTest def test_fizz_buzz assert_equal '1', fizz_buzz(1) assert_equal '2', fizz_buzz(1) assert_equal 'Fizz', fizz_buzz(3) end end
このようになる。
検証メソッド 期待する結果, 検証したいもの
とする。
他にも、RSpec
、test-unit
というテスティングフレームがある。
Ruby on Rails
deviseでログイン機能を実装
devise
というgemを使って、ログイン機能を実装してみる。
deviseを利用する場合は、model
を作成する際に、
rails g devise User
と入力するので、間違えないように注意する。
user_signed_in?
のように、deviseを導入しないと使えないメソッドを利用して、ログイン時、非ログイン時の表示を変えたりする。
user_signed_in?
は、ログインしているかどうかを真偽値で返してくれるため、if文に利用するとよい。
他にもauthenticate_user!
メソッドがある。
これは、ログインしていないときにはトップページにリダイレクトさせるメソッドで、before_action
と組み合わせて使用することで、ログインしていないときにアクセスされると困るページにアクセスできないようにすることができる。
i18nを利用して、日本語化する
他言語に対応できるgem、rails-i18n
, devise-i18n
を利用して、deviseで作られる英語のページを日本語化する。
Gemfileに、
gem 'rails-i18n', '~> 6.0' gem 'devise-i18n'
と記述する。(Rails 6なので、6.0で記述)
bundle install
を実行後、configディレクトリにあるapplication.rb
ファイルに、
module DeviseSample class Application < Rails::Application ....略... config.i18n.default_locale = :ja
と設定することで、日本語にすることができる。
タイムゾーンを変更したい場合も、以下のように記述をする。
config.time_zone = 'Asia/Tokyo'
i18n
を導入し、これを利用して新しくビューファイルを作成する場合は、i18n
に対応したコマンドを入力しなければならないことに注意。
rails g devise:i18n:views
今日のやらかし
text_field
にして、テキスト入力をさせたい部分を、間違えてemail_field
にしてしまっていた。
入力形式に気をつける。