edy hub

プログラミングやライフスタイルについて書き綴っています

Railsのフォームでenumを用いた複数個のラジオボタンを生成する

はじめに

enumの値ごとにラジオボタンを作るのが面倒だったので、どうにかまとめられないかというのが起点。

collection_select_boxみたいなものがあればという淡い期待のもと調査をしてみます。

元のコード

= form_for object do |f|
  = f.radio_button :status, 'good'
  span
    | Good
  = f.radio_button :status, 'normal'
  span
    | Normal
  = f.radio_button :status, 'bad'
  span
    | Bad

まとめる

        = collection_radio_buttons(@object, :status, Object.statuses, :first, :first) do |b|
          .m-form-checkbox__item
            = b.radio_button + b.label

bundle install時にmysql2のインストールでエラーになる

はじめに

bundle installすると、

Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

// 中略

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Users/edayuki/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-17/2.6.0-static/mysql2-0.5.2/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Users/edayuki/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/gems/mysql2-0.5.2 for inspection.
Results logged to /Users/edayuki/.rbenv/versions/2.6.1/lib/ruby/gems/2.6.0/extensions/x86_64-darwin-17/2.6.0-static/mysql2-0.5.2/gem_make.out

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.

mysql2あたりでbundle installが失敗してるっぽい。 これをやってみろと書いてある。

`gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`

指定されたコマンドを入力してみる

`gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`

これでも無理だ、、、

調査してみると

Xcodeコマンドラインツールをインストールするのが吉なようです。

$ xcode-select --install

このあとに、改めて先程のコマンドを入力してみます。

$ sudo gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'

※sudoつけないと権限で弾かれるので、付与しました。

結果として、

Building native extensions. This could take a while...
Successfully installed mysql2-0.5.2
Parsing documentation for mysql2-0.5.2
Installing ri documentation for mysql2-0.5.2
Done installing documentation for mysql2 after 0 seconds
1 gem installed

となり、mysql2をインストールすることができました!

最後にbundle install

改めてbundle installすると、綺麗にインストールできました! めでたし!

Rubyのバージョンを2.5.3に上げる〜Docker編〜

はじめに

Dockerfileを編集

rubyのバージョンを2.5.3に変更

$ docker-compose up --build

はいエラー bundlerのバージョンがよろしくないみたいですね。

docker-image

bundlerのバージョンを変更

-  gem 'bundler', '1.15.4'
+  gem 'bundler', '1.17.2'

Gemfile.lock内の古いバージョンの記述も変更します。 基本的にbundlerでgrepしてあげたら良いですが、最下部にある BUNDLED_WITH の変更も忘れないように。

 BUNDLED WITH
-   1.15.4
+   1.17.2

これでDockerのビルドが成功しました。

Redis ObjectsをRailsで使ってみる

はじめに

これはRedis導入後に、Redis Objectsの使い方を学ぼうと思った一人の若者の備忘録です。

GitHubリポジトリを参考にしています。

GitHub - nateware/redis-objects: Map Redis types directly to Ruby objects

Gemの導入

はじめに、Gemfileにgemを追加します。

gem 'redis-objects'

モデルクラスに組み込んでみる

Redis::Objectsをモデルクラスにインクルードします。 Redis::Obejcetsは ユニークな値を返すメソッドであるid を備えているクラスであれば効果的に活用できます。 そして、自動的に各オブジェクトに対してユニークなキーを発行してくれたりします。

例:下記のようなフォーマット

model_name:id:field_name

Userクラスで試してみる

class User
  include Redis::Objects
  counter :my_posts
  def id
    1
  end
end

user = User.new
user.id  # 1

user.my_posts.increment
user.my_posts.increment
user.my_posts.increment
puts user.my_posts.value # 3

user.my_posts.reset
puts user.my_posts.value # 0

user.my_posts.reset 5
puts user.my_posts.value # 5

スタンドアロンな用法

Counters

任意のcounter_nameをキーとしてRedisに保存される仕組み。

@counter = Redis::Counter.new('counter_name')
@counter.increment  # or incr
@counter.decrement  # or decr
@counter.increment(3)
puts @counter.value

Values

シンプルな値も簡単に取り扱えます。

@value = Redis::Value.new('value_name')
@value.value = 'a'
@value.delete

Lists

ListsRubyの配列のような働きをします。 配列を扱う際に登場するメソッドが同じように使えて便利。

@list = Redis::List.new('list_name')
@list << 'a'
@list << 'b'
@list.include? 'c'   # false
@list.values  # ['a','b']
@list << 'c'
@list.delete('c')
@list[0]
@list[0,1]
@list[0..1]
@list.shift
@list.pop
@list.clear
# etc

配列の最大保持数も指定できます。 ※ :maxlengthオプションを使います。最も古い要素を配列外に出します。

# 最大10個の要素だけ保持したいとき。
@list = Redis::List.new('list_name', :maxlength => 10)

Hashes

HashesもRubyのHashのような働きをします。Redis独自の仕様もあります。 RubyのHashとの衝突を避けるために、HashKeyという命名になっています。

@hash = Redis::HashKey.new('hash_name')
@hash['a'] = 1
@hash['b'] = 2
@hash.each do |k,v|
  puts "#{k} = #{v}"
end
@hash['c'] = 3
puts @hash.all  # {"a"=>"1","b"=>"2","c"=>"3"}
@hash.clear

Redis上では、数字は文字列になることに注意してください。

Sets

SetsはRubyのSetクラスのようなものです。 順序立てられたものではないですが、要素の一意性が担保されます。

@set = Redis::Set.new('set_name')
@set << 'a'
@set << 'b'
@set << 'a'  # dup ignored
@set.member? 'c'      # false
@set.members          # ['a','b']
@set.members.reverse  # ['b','a']
@set.each do |member|
  puts member
end
@set.clear
# etc

Sorted Sets

プロパティーの一意性に伴い、Sorted Setsはハッシュと配列の両取りをしたような働きをします。 ハッシュのように割り当てることができ、取り出すときは配列風になります。

@sorted_set = Redis::SortedSet.new('number_of_posts')
@sorted_set['Nate']  = 15
@sorted_set['Peter'] = 75
@sorted_set['Jeff']  = 24

# Array access to get sorted order
@sorted_set[0..2]           # => ["Nate", "Jeff", "Peter"]
@sorted_set[0,2]            # => ["Nate", "Jeff"]

@sorted_set['Peter']        # => 75
@sorted_set['Jeff']         # => 24
@sorted_set.score('Jeff')   # same thing (24)

@sorted_set.rank('Peter')   # => 2
@sorted_set.rank('Jeff')    # => 1

@sorted_set.first           # => "Nate"
@sorted_set.last            # => "Peter"
@sorted_set.revrange(0,2)   # => ["Peter", "Jeff", "Nate"]

@sorted_set['Newbie'] = 1
@sorted_set.members         # => ["Newbie", "Nate", "Jeff", "Peter"]
@sorted_set.members.reverse # => ["Peter", "Jeff", "Nate", "Newbie"]

@sorted_set.rangebyscore(10, 100, :limit => 2)   # => ["Nate", "Jeff"]
@sorted_set.members(:with_scores => true)        # => [["Newbie", 1], ["Nate", 16], ["Jeff", 28], ["Peter", 76]]

# atomic increment
@sorted_set.increment('Nate')
@sorted_set.incr('Peter')   # shorthand
@sorted_set.incr('Jeff', 4)

Rubymineの「typo」警告を特定のワードの場合に無くしたい

どんなケース?

これはtypoに見せかけて、プロジェクト内では列記とした単語なんじゃ!という場合。 毎回警告が出るとうざいですよね。 f:id:yuki-eda0629:20190323150041p:plain

解決方法

該当ワードで右クリック すると、Spellingという項目が出てきます(自分の場合は、トップに出てきました) f:id:yuki-eda0629:20190323150309p:plain

さらに「Spelling」> 「Save '該当ワード' to project-level directory」を選択 f:id:yuki-eda0629:20190323150406p:plain

さいごに

波線と警告がなくなりました!!めでたし! f:id:yuki-eda0629:20190323150603p:plain