ためすう
Ruby の Symbol (シンボル) について
2019-05-07やったこと
Ruby の Symbol (シンボル) が腑に落ちていないので、調べてみます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
調査
シンボルを3つの方法で定義してみます。
$ rails c
irb(main):010:0> :symbol
=> :symbol
irb(main):011:0> :'symbol'
=> :symbol
irb(main):012:0> %s!symbol!
=> :symbol
シンボルを定義しただけなので、このコードに意味はあまりありません。
シンボル自体の説明を以降でします。
Symbol (シンボル)
概要
シンボルは任意の文字列と一対一に対応するオブジェクトです。
同じ内容のシンボルはかならず同一のオブジェクトです
メリット
- 処理の効率が良いこと
- immutable (不変) である
参考
Ruby で send を使ってみる
2019-05-07やったこと
Ruby で、send というメソッドを使ってみます
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
調査
test.rb
class Sample
def method_a
p 'method_a'
end
def method_b
p 'method_b'
end
def output
send(:method_a)
end
end
s = Sample.new
s.send(:method_a)
s.send('method_b')
s.output
出力結果
$ ruby test.rb
"method_a"
"method_b"
"method_a"
参考
Ruby で関数の引数の数を動的にする方法
2019-05-07やったこと
Ruby で、関数の引数の数を動的にする方法を調べます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
調査
test.rb
def output(*params)
params.each do |param|
p param
end
end
output(:a, :b, :c)
出力結果
$ ruby test.rb
:a
:b
:c
* について
引数の直前に * がついている場合、その引数の値が展開されて 渡されます。展開はメソッド to_a を経由して行なわれます。
参考
Rails5 で定数を指定する
2019-05-06やったこと
Rails5 で、定数を設定する方法を調べます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
調査
ApplicationController で定義
app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
TITLE = 'title1'
app/controllers/tasks_controller.rb
class TasksController < ApplicationController
def index
logger.debug(TITLE)
end
end
TITLE という定数をそのまま利用できます。
config/initializers/constants.rb で定義
ファイルを新規作成します。
config/initializers/constants.rb
TITLE2 = 'title2'
参考
Rails5 でタイムゾーンを設定する
2019-05-06やったこと
Rails5 で、タイムゾーンを設定する方法を調べます。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
調査
変更前の確認
午前1時ごろ確認しました。 UTC の時間になっています。
irb(main):000:0> Time.zone.now
=> Wed, 01 May 2019 16:13:32 UTC +00:00
config.time_zone の更新
config/application.rb
config.time_zone = 'Tokyo'
変更後の確認
irb は立ち上げ直します。
irb(main):000:0> Time.zone.now
=> Thu, 02 May 2019 01:17:25 JST +09:00
見てみると、JST になっています。
おまけ
config.active_record.default_timezone も設定しておいた方が良いかもしれないです。
DBに読み書きする時刻に影響する
Railsのデフォルトでは:utc
参考
Rails5 の form タグで送信される utf8 を消す
2019-05-06やったこと
Rails5 の form タグで get メソッドで送信後の URL で utf8 が付与されないようにします。
方法を2つ考えました。
- utf8 が送信されないようにする
- utf8 が送信された後、URL に utf8 が付与されないようにする
今回は、
- utf8 が送信されないようにする でやってみたいと思います。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
調査
下記のコードで実現できました。
※ @task は任意のモデルを指定します。
<%= form_for(@task, { :method => 'get', :html => { enforce_utf8: false }}) do |f| %>
<%= f.submit 'submit' %>
<% end %>
参考
Ruby で <=> 演算子でソートする
2019-05-06やったこと
Ruby でソートする方法について調べました。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
調査
<=> 演算子について
<=>演算子(メソッド)は、2つの配列の順序を調べます
$ irb
irb(main):001:0> 1 <=> 2
=> -1
irb(main):002:0> 2 <=> 1
=> 1
irb(main):003:0> 1 <=> 1
=> 0
$ irb
irb(main):001:0> ary1 = ['d', 'a', 'e', 'c', 'b']
=> ["d", "a", "e", "c", "b"]
irb(main):002:0> p ary1.sort
["a", "b", "c", "d", "e"]
=> ["a", "b", "c", "d", "e"]
irb(main):003:0> ary2 = [9, 7, 10, 11, 8]
=> [9, 7, 10, 11, 8]
irb(main):004:0> p ary2.sort
[7, 8, 9, 10, 11]
=> [7, 8, 9, 10, 11]
irb(main):005:0> p ary2.sort{|a, b| a <=> b}
[7, 8, 9, 10, 11]
=> [7, 8, 9, 10, 11]
irb(main):006:0> p ary2.sort{|a, b| b <=> a}
[11, 10, 9, 8, 7]
=> [11, 10, 9, 8, 7]
参考
Ruby でクラスメソッドを使ってみる
2019-04-29やったこと
Ruby でクラスメソッドの書き方について調べました。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
調査
test.rb
class Sample
def Sample.foo
p 'Sample.foo'
end
def self.foo2
p 'self.foo2'
end
end
Sample.foo
Sample.foo2
出力結果
$ ruby test.rb
"Sample.foo"
"self.foo2"
参考
Ruby の例外処理を試してみる
2019-04-29やったこと
Ruby で例外処理について調べてみました。
今回は下記について調べてみます。
- rescue
- retry
- ensure
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
調査
rescue
StandardError 例外クラスのサブクラスだけ捕捉します。
retry
retry は、rescue 節で begin 式をはじめからもう一度実行するのに使用します。 retry を使うことである処理が成功するまで処理を繰り返すようなループを作ることができます。
ensure
ensure 節が存在する時は begin 式を終了する直前に必ず ensure 節の本体を評価します。
動かしてみる
今回は、メソッドの定義に resuce, ensure を実装してみたいと思います。
クラス/メソッドの定義/クラス定義、クラス/メソッドの定義/モジュール定義、クラス/メソッドの定義/メソッド定義 などの定義文では、それぞれ begin なしで rescue, ensure 節を定義でき、これにより例外を処理することができます。
test.rb
class Sample
def initialize
@count = 0
end
def output
@count += 1
puts 'start'
puts 1 / 0
puts 'success'
rescue => e
puts 'rescue block'
if @count > 3
raise
end
retry
ensure
puts 'ensure block'
end
end
s = Sample.new
s.output
出力結果
$ ruby test.rb
start
rescue block
start
rescue block
start
rescue block
start
rescue block
ensure block
Traceback (most recent call last):
2: from test.rb:26:in `<main>'
1: from test.rb:10:in `output'
test.rb:10:in `/': divided by 0 (ZeroDivisionError)
処理は4回目の例外発生で終わっていることが分かると思います。
参考
やったこと
Rails5 で jQuery を利用できるようにしました。
確認環境
$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]
$ rails --version
Rails 5.2.3
実施
下記で
'jquery-rails'
Gemfile の更新
//= require jquery3
//= require popper
//= require bootstrap-sprockets
※ もし反映されない時はサーバーを再起動などしてみてください(もちろん開発環境で)
view ファイルにドロップダウンメニューを追加します
hover した時にメニューを開くようにする css も追加しています。
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle"
type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Dropdown button
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
<!-- hover で開くようにする -->
<style>
.dropdown:hover > .dropdown-menu {
display: block;
}
</style>
クリックイベントの削除
hover した後にクリックすると、メニューが横に少しずれます。 それを防ぐには下記の js を追加してください。
※ クリックイベントを削除しています。 簡略化のため、全部クリックイベントを切っているので注意してください。
<script>
$(document).off("click");
</script>