ためすう
Rails5 で ルーティングを設定する (基本編)
2019-04-24やったこと
Rails5 でルーティングを設定する方法を調べました。 今回の対象は基本だけに絞ります。
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
$ rails --version
Rails 5.2.3
調査
現在設定されているルーティングは下記で確認できます。
$ rails routes
resources ルーティングを自動生成する
config.ru
resources :tasks
root を指定する
config.ru
root 'tasks#index'
/
にアクセスすると、tasksコントローラーのindexアクションが呼び出されます。
所感
ルーティングの resources なんかは、 rails の「設定より規約」を感じられるかもしれません。
- url が自動生成される
- url を解析して実行するアクションを決定する (基本ルールに則った形)
ドキュメントを見ると、色々な設定方法があり、痒い所に手が届きそうな気がします。
規約通り実装できるものに関しては、かなりシンプルにかけそうです。
参考
Ruby と Ruby on Rails で確認する環境
2019-04-23やったこと
Ruby と Rails のとあるAPIの動作を試すときに使う環境を調べました。
調査
irb (ruby のみ)
$ irb
irb(main):001:0> puts 'hello'
hello
=> nil
ちなみに irb は Interactive Ruby の略のようです。 どのディレクトリからも実行できて、ファイルも保存せずに試せます。
rails console
内部的に irb を使っているようです。(コードリーディングまでは出来てない)
$ rails c
実行例が下記です。
Railsチュートリアルで作成したサンプルアプリにて、コンソールを立ち上げました。 Userクラスが読み出せているのが分かると思います。 (Userクラスは Rails のモデルです)
Running via Spring preloader in process 58267
Loading development environment (Rails 5.1.6.2)
...
irb(main):002:0> User.first
User Load (1.0ms) SELECT "users".* FROM "users" ORDER BY "users"."id" ASC LIMIT ? [["LIMIT", 1]]
=> #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2019-03-29 03:48:50", updated_at: "2019-03-29 03:48:50", password_digest: "$2a$10$8CzQ9IXLNgrO4dT5cRKU1O41PJ3zJ.Wl41Vh/N/KWLl...", remember_digest: nil, admin: true, activation_digest: "$2a$10$GHz5AmbuxCBR0J0VrhOGMOuDPvWf4piIUV6y7AX8JTF...", activated: true, activated_at: "2019-03-29 03:48:50", reset_digest: nil, reset_sent_at: nil>
xxx.rb でターミナルで実行する (ruby のみ)
test.rb
puts 'test now'
$ ruby test.rb
出力結果
test now
vim 開いたまま実行する (ruby のみ)
vim で quickrun
を導入します
~/.vimrc に下記を追加
NeoBundle 'thinca/vim-quickrun'
さらに :NeoBundleInstall
test.rb
puts 'test now1'
puts 'test now2'
puts 'あああ'
:QuickRun
すれば、vim のペインが開き下記が出力されました。
test now1
test now2
あああ
さらに選択した行だけでも実行できました。
参考
Ruby と Ruby on Rails のドキュメント
2019-04-23やったこと
Ruby と Rails に触れる機会が増えたので、参考にするドキュメントを調査します。
調査
Ruby
github の README.md に記載があったリファレンスです。
Ruby on Rails
github の README.md に記載があったリファレンスです。
Rails Guide からこちらのリンクが貼られています。
↓ こちらは日本語に翻訳されているサイトもあります。
Ruby on Rails のソースコードを読む
2019-04-22やったこと
Ruby on Rails のソースコードを読む方法を調べました。
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
調査
選択肢1
github から Ruby on Rails の ソースコードを落とす
GitHub - rails/rails: Ruby on Rails
この方法の難点は、(あまりないかもしれませんが)Rails の本体をいじって動作を確かめるということが出来なさそうなところです。
選択肢2
rails が install されているファイルから読む
ローカルで実行しているということは、Rails のソースコードもローカルのどこかにあると思われるので、インストールされているファイルから読みます。
今回は、こちらでやってみます。
インストールされているrailsを読む (選択肢2)
gem のインストール先確認
$ gem environment
出力 (一部抜粋)
INSTALLATION DIRECTORY: /Users/xxxxx/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0
上記のディレクトリからrailsを探したのですが、README.mdしかありませんでした。
/Users/xxxxx/.rbenv/versions/2.2.7/lib/ruby/gems/2.2.0/gems/rails-5.2.2/
どうやら Rails は個別の gem が集合して出来ているようです。
gem のインストール先に下記のディレクトリが存在していました。
rails のソースコードにあるディレクトリ
actioncable
actionmailbox
actionmailer
actionpack
actiontext
actionview
activejob
activemodel
activerecord
activestorage
activesupport
... (続く)
本来ならソースコードを変更して確かめたいところですが、どの gem がどういう役割なのか分かっていないので今日はこの辺で終わります。
Ruby の配列で、先頭、最後の要素を取得する
2019-04-22やったこと
Ruby の配列で先頭、最後の要素を取得する方法を調べました。
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
調査
irb を起動します。
$ irb
irb(main):002:0> a = ["a", "b", "c", "d"]
=> ["a", "b", "c", "d"]
irb(main):003:0> a.first
=> "a"
irb(main):004:0> a.last
=> "d"
irb(main):005:0> a
=> ["a", "b", "c", "d"]
この確認から分かることは、first
last
で呼び出した後も、元の配列は変更されないということです。
元の配列も変更したいときは、shift
pop
を使います。
irb(main):007:0> a.pop
=> "d"
irb(main):008:0> a
=> ["a", "b", "c"]
irb(main):009:0> a.shift
=> "a"
irb(main):010:0> a
=> ["b", "c"]
参考
Ruby の定数、変数について
2019-04-16やったこと
Ruby での定数、変数について調べました。
下記について調べます。
- 定数
- ローカル変数
- グローバル変数
- インスタンス変数
- クラス変数
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
定数
定数名は大文字アルファベットで始まる必要があります。
ABC = 'abc'
ローカル変数
ローカル変数名は「ruby」や「ruby」のように先頭が小文字アルファベットかアンダースコア()で始まる必要があります。
ruby = 'ruby_string'
_ruby = 'ruby_string'
グローバル変数
グローバル変数名は$から始まる必要があります。
$abc = 'abc'
インスタンス変数
インスタンスの中でだけ参照できる変数をインスタンス変数と言います。
「クラスインスタンス変数」というものもあるようですが、今回は割愛します。
class My
def initialize()
@length = 0
end
def length
@length += 1
end
end
p @length
c = My.new
p c.length
p c.length
c2 = My.new
p c2.length
実行結果
$ ruby test.rb
nil
1
2
1
attr_accessor を利用すると、インスタンス変数のセッター、ゲッターが定義されるようです。(今回は試しません)
クラス変数
@2つからはじまる名前で記述します。
class My2
@@length = 0
def printLen
@@length += 1
end
end
my2 = My2.new
p my2.printLen
p my2.printLen
my2_2 = My2.new
p my2_2.printLen
実行結果
$ ruby test.rb
1
2
3
参考
- パーフェクトRuby
- 【まとめ】インスタンス変数、クラス変数、クラスインスタンス変数 - Qiita
Ruby でデバッグするときに使うメソッド (p、puts、print)
2019-04-15やったこと
Ruby でデバッグするときのメソッドを調べました
下記のメソッドを試しました。
- p
- puts
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
調査
test.rb
a = {key: 1, name: 'abc'}
b = [1, 2, 3]
puts 'p で出力'
p a
print "\n"
p b
print "---\n"
puts 'puts で出力'
puts a
print "\n"
puts b
print "---\n"
puts 'print で出力'
print a
print "\n"
print "\n"
print b
print "\n"
実行結果
$ ruby test.rb
p で出力
{:key=>1, :name=>"abc"}
[1, 2, 3]
---
puts で出力
{:key=>1, :name=>"abc"}
1
2
3
---
print で出力
{:key=>1, :name=>"abc"}
[1, 2, 3]
参考
Ruby で配列コピーするときに Marshal を使う
2019-04-14やったこと
Ruby で配列コピーするときに、うまくいかない場合がありました。
Marshal を使ってコピーして解決しました。
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
調査
test.rb
c1 = [
1, 2, 3
]
c2 = c1
c2[0] = 9999999
p c2[0]
p c1[0]
実行結果
$ ruby test.rb
9999999
9999999
どうやら変数の c1 と c2 は同じ参照を持っているようです。 違う方法でコピーすることにします。
test2.rb
c3 = [
1, 2, 3
]
c4 = Marshal.load(Marshal.dump(c3))
c3[0] = 9999999
p c3[0]
p c4[0]
実行結果
$ ruby test2.rb
9999999
1
うまくいきました。
Ruby を irb 上で動作させている時、外部ファイルの読み込み直しをする
2019-04-11やったこと
Ruby を irb 上で動作させている時、外部ファイルの読み込み直しをする方法について調べました。
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
調査
my_class.rb
class MyClass
def display
p 'test-print1'
end
end
出力結果の例
$ irb
irb(main):013:0> require "./my_class"
=> true
irb(main):014:0> a = MyClass.new
=> #<MyClass:0x007f91c1399810>
irb(main):015:0> a.display()
"test-print1"
ここで my_class.rb を書き換えます。
class MyClass
def display
p 'test-print2'
end
end
irb 上で該当ファイルを load します。 require では変更が反映されませんでした。
require で試した場合 (※ 変更が反映されないパターン)
irb(main):017:0> require "./my_class"
=> false
irb(main):018:0> a = MyClass.new
=> #<MyClass:0x007f91c1379510>
irb(main):019:0> a.display()
"test-print1"
=> "test-print1"
load で試した場合
irb(main):020:0> load "./my_class.rb"
=> true
irb(main):021:0> a.display()
"test-print2"
=> "test-print2"
参考
Ruby の hash で存在していない key を参照しようとした場合の挙動を制御する
2019-04-10やったこと
Ruby の hash で存在していない key を参照しようとした場合の挙動を制御する方法について調べました。
確認環境
$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]
調査
test.rb
h = {key: 'value'}
p h[:key]
p h[:key2]
h2 = Hash.new do |k, v|
# ここで例外を発生させるなどする
p "#{v} is nothing"
end
h2[:key] = 'value'
p h2[:key]
h2[:key2]
実行結果
$ ruby test.rb
"value"
nil
"value"
"key2 is nothing"