ためすう

Rails5 の migration で追加するカラムの順番を制御する

2019-05-09

やったこと

Rails5 の migration を利用してカラムを追加する時、追加する位置を制御する方法について調べました。

確認環境

$ ruby --version
ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

$ rails g model Task2 name:string content:text
$ rails db:migrate

ここで、task2 テーブルに status カラムを content カラムの後に追加します。

$ rails g migration AddStatusAtToTask2s status:int

これが生成されたファイルです。

db/migrate/20190508233635_add_status_at_to_task2s.rb

class AddStatusAtToTask2s < ActiveRecord::Migration[5.2]
  def change
    add_column :task2s, :status, :int
  end
end

※ 日時部分は実行時間によって変わります。

下記のように変更します。 デフォルトのままだと、カラムが一番後に追加されます。

class AddStatusAtToTask2s < ActiveRecord::Migration[5.2]
  def change
    add_column :task2s, :status, :int, after: :content
  end
end
$ rails db:migrate

無事に意図した位置にカラムを追加することができました。

参考

&. で nil チェック (Ruby)

2019-05-09

やったこと

&. を利用して nil のチェックをしてみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

$ rails c

irb(main):001:0> foo = 13
=> 13
irb(main):002:0> foo&.to_s
=> "13"
irb(main):003:0> nil&.to_s
=> nil
irb(main):004:0> nil.to_s
=> ""
irb(main):005:0> nil.hoge
Traceback (most recent call last):
        2: from (irb):5
        1: from (irb):5:in `rescue in irb_binding'
NoMethodError (undefined method `hoge' for nil:NilClass)
irb(main):006:0> nil&.hoge
=> nil

&. について

メソッド呼び出しで .' の代わりに&.’ を使うことができます。 この形式でメソッドを呼びだそうとすると、レシーバが nil の場合は 以下のように働きます。 - 引数の評価が行なわれない - メソッド呼び出しが行われない - nil を返す

safe navigation operator(通称「ぼっち演算子」)

参考

Rails5 で日付、日時をフォーマットする

2019-05-08

やったこと

Rails5 で日付、日時をフォーマットする方法を調べます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

調査

方法1. strftime

irb(main):001:0> Date.current.strftime('%Y/%m/%d')
=> "2019/05/08"

この方法は都度フォーマットを指定する必要があります。

方法2. config/locales

I18n の機能を利用します

デフォルトの言語を日本語にします

config/application.rb

config.i18n.default_locale = :ja

次に、yml でフォーマットを定義します

config/locales/ja.yml

ja:
  date:
    formats:
      default: '%Y/%m/%d'
      long: '%Y年%m月%d日'
      short: '%m/%d'

I18n を使って日付をフォーマットします。

$ rails c
Running via Spring preloader in process 87044
Loading development environment (Rails 5.2.3)
irb(main):001:0> I18n.l(Date.today)
=> "2019/05/08"
irb(main):002:0> I18n.l(Date.today, format: :long)
=> "2019年05月08日"
irb(main):003:0> I18n.l(Date.today, format: :short)
=> "05/08"

参考

Ruby で引数にメソッドを渡す

2019-05-07

やったこと

Ruby の関数で引数にメソッドを渡す方法を調べてみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

調査

test.rb

def xxx(&yyy)
  p yyy
  yyy.call
end

def abc1
  p 'abc1'
end

## ブロック付きメソッド呼び出し
## { ... }
p '{ ... }'
xxx {
  abc1
}

## do ... end
p 'do ... end'
xxx do
  abc1
end

出力結果

$ ruby test.rb
"{ ... }"
#<Proc:0x00007faa8a036588@ruby-block.rb:13>
"abc1"
"do ... end"
#<Proc:0x00007faa8a036358@ruby-block.rb:19>
"abc1"

最後の引数の直前に & がついている場合、その引数で指定した手続き オブジェクト(Proc)やメソッドオブジェクト(Method)がブロック としてメソッドに渡されます。

参考

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

参考