ためすう

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>

参考

Rails5 で jQuery を使う

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

実施

Gemfile に追加

Gemfile

gem "jquery-rails"
$ bundle install

jquery の読み込み

app/assets/javascripts/application.js に下記を追加します。

//= require jquery
//= require jquery_ujs

jQuery を使う

view ファイルで jQuery を使います。

<div id="test">font</div>
<script>
  $("#test").css("font-size", "20px")
</script>

これで jQuery が利用できるようになりました。

参考

Rails5 で Bootstrap4 をインストールする

2019-04-25

やったこと

Rails5 で Bootstrap4 を設定する方法を調べました。

確認環境

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

gem のインストール

どのバージョンか忘れましたが、今回より古いバージョンの時はインストールが必要だった気がしたのですが、元から入っているようです。

bootstrap-sass がインストールされていればOKです。

Gemfile.lock

     bootstrap-sass (3.3.7)
       autoprefixer-rails (>= 5.2.1)
       sass (>= 3.3.4)

ここでちょっと注意です。 4系に対応するには、違うgemを使います。

gem 対応バージョン
bootstrap-sass 2 or 3系
bootstrap 4系

このままではあまり面白くないので、4系を入れてみます。 インストール手順は github の通りですが、とにかくやってみます。

Gemfile

gem 'bootstrap', '~> 4.3.1'
$ bundle install

端折りますが、下記を参考にしてください。

ruby のバージョンを上げてから、bundle install でコケた時にやること – ためすう

ファイルの編集

ファイルの拡張子を scss にします

$ mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss
app/assets/stylesheets/application.scss

上記ファイルを編集して、bootstrap を読み込みます

@import "bootstrap";

Boostrap4 の機能を使ってみる

表示したい view ファイル

<div class="btn-group" data-toggle="buttons">
  <label class="btn btn-primary active">
    <input type="radio" name="options" id="option1" checked=""> Radio 1 (preselected)
  </label>
  <label class="btn btn-primary">
    <input type="radio" name="options" id="option2"> Radio 2
  </label>
</div>

※ もし反映されない時はサーバーを再起動などしてみてください(もちろん開発環境で)

最後に

もし、bootstrap-sass を使わないなら、削除しておいても良いかもしれませんね。

参考

Bootstrap 4 Cheat Sheet by Creative Tim and BootstrapBay

これ見ながらやると捗ります。

ruby のバージョンを上げてから、bundle install でコケた時にやること

2019-04-25

やったこと

Rails5 で利用する Ruby のバージョンをあげた後、bundle install がコケた時のメモです。

確認環境

作業前

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

$ rails --version
Rails 5.2.3

作業後

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

実施

Ruby のバージョンを 2.2.7 -> 2.5.0 にした後、

bundler のインストール

$ bundle update
エラー抜粋
rbenv: bundle: command not found

The `bundle' command exists in these Ruby versions:
  2.1.5
  2.2.2
  2.2.7

bundle コマンドが rbenv の 2.5.0 で利用できない状態だからです。

ということで、bundler を入れます。

$ gem install bundler
Fetching: bundler-2.0.1.gem (100%)
Successfully installed bundler-2.0.1
Parsing documentation for bundler-2.0.1
Installing ri documentation for bundler-2.0.1
Done installing documentation for bundler after 3 seconds
1 gem installed

bundler でコケる

$ bundle install
Traceback (most recent call last):
	2: from /Users/xxxx/.rbenv/versions/2.5.0/bin/bundle:23:in `<main>'
	1: from /Users/xxxx/.rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems.rb:308:in `activate_bin_path'
/Users/xxxx/.rbenv/versions/2.5.0/lib/ruby/2.5.0/rubygems.rb:289:in `find_spec_for_exe': can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException)
$ gem install bundler -v 1.16.1

これを実行して、もう1回 bundle install します。

nokogiri でコケる

$ bundle install

エラー抜粋

An error occurred while installing nokogiri (1.9.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.9.1'` succeeds before bundling.

...


pkg-config could not be used to find libxml-2.0
Please install either `pkg-config` or the pkg-config gem per

    gem install pkg-config -v "~> 1.1"

この gem を取り込めば OK そうです。

インストール後、bundle install は無事に終わりました。(やっていることの割に険しかった)

参考

Rails5 で利用する Ruby のバージョンを上げる

2019-04-24

やったこと

Rails5 で利用する Ruby のバージョンをあげました。

確認環境

作業前

$ ruby -v
ruby 2.2.7p470 (2017-03-28 revision 58194) [x86_64-darwin16]

$ rails --version
Rails 5.2.3

作業後

$ ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

実施

新しいバージョンの Ruby をインストール

ある gem を利用しようとしたら ruby のバージョンを上げろと言われたので

仕方なく上げることにしました。

今回は 2.5.0 に切り替えます。

利用するバージョンの切り替え

$ rbenv global 2.5.0

Railsプロジェクトの .ruby-version 更新

.ruby-version

2.5.0

数分嵌りました…

このファイルは rbenv が ruby のバージョン決めるときにみるやつです。

Gemfileを更新して、bundle install

Gemfile

ruby '2.5.0'

bundle 実行

$ bundle install

エラーがいっぱい出る可能性がありますが(Ruby のバージョンがこの記事と同じなら発生するかもです)

Google力でなんとか乗り切ってください。

2019/04/25 修正

発生したエラーの解決は別記事に切り出して、投稿後リンク貼ります…

下記に発生したエラーを解決した時の記事のリンクを貼ります。

ruby のバージョンを上げてから、bundle install でコケた時にやること – ためすう

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
あああ

さらに選択した行だけでも実行できました。

参考