ためすう

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 で Boostrap4 で、hover した時にドロップダウンメニューを開く

2019-04-26

やったこと

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>

参考