のえら

技術備忘とかメモとか.間違いはつっこんでいただきたい所存.アフィリエイトはやっていません.

rescueを1行で書きたい

JSONでパースをかけるときに、変換できない形式のときにエラーになる。
空かどうかのチェックは事前にできるけど、パースができるかのチェックはできないようなので、nilで返してその後処理をするよう。
が、これだけのためにbegin句で複数行になるのは微妙かな?と思って調べてみると、1行でかけることがわかった。

橋本商会 » Rubyのrescueって1行で書くと値を返すのね・・

(以下、ざっくりとした例)

return nil if str.blank? # ここで事前チェックしたりなんだり
result  = begin
  JSON.parse(str)
rescue => e
  nil
end
str = '['
JSON.parse(str) rescue nil

が、rubocopの規約に引っかかったので、可読性を上げるためにも素直に複数行で書くようにしました。。

Style/RescueModifier:
Description: 'Avoid using rescue in its modifier form.'
StyleGuide: '#no-rescue-modifiers'
Enabled: true

※エラーの種別を判断して、きちんと処理しろということであってるのかしら。。
exceptions - Ruby-style-guide - Womply - Relish

【rails】solrのfacetでカラムごとにまとめたときの件数が100しか取得できない

solrでfacetを使うと、指定したカラムごとにまとめた結果を取得することができる。

results = User.search do
  facet(:hoge_ids, :foo_ids)
end
results.facet(:hoge_ids).rows

これはhoge_idsとfoo_idsでまとめて、facet(:hoge_ids).rowsでhoge_idsの結果を取得している。
このとき、まとめた件数が100件以上あっても上限が100件になってしまう。

# return 100
results.facet(:foo_ids).rows.count

max100件の設定も指定もしてないよなぁ、と思って調べてみると、readmeに書いてあった。。読もうね自分!
GitHub - sunspot/sunspot: Solr-powered search for Ruby objects

By default Sunspot will only return the first 100 facet values. You can increase this limit, or force it to return all facets by setting limit to -1.

 -1を指定しろとのこと。

User.search do
  facet(:hoge_ids)
  # 対象のカラムのみ指定する
  facet(:foo_ids, limit: -1)
  # どちらも全件返したいときは、1行ずつ指定する必要がある(引数まとめて書けない)
end

参考URL:
http://stackoverflow.com/questions/24388263/faceting-with-solr-sunspot-gem-facets-quantity-limit
https://groups.google.com/forum/#!topic/ruby-sunspot/yPXwPtzJSLI

【ruby】配列Aの中に配列Bの値が含まれているか確認したい

配列Aの中に配列Bの値が一つ以上含まれているか確認したくて、ぐるぐる回せばいいかなぁと思って書いたコードが以下。
※present?はrailsのArray拡張メソッド

[1] pry(main)> list1 = %w(apple banana melon)
=> ["apple", "banana", "melon"]
[2] pry(main)> list2 = %w(watermelon grape apple)
=> ["watermelon", "grape", "apple"]

[3] pry(main)> list1.any? { |f| list2.include?(f) }
=> true

もっとシンプルにかけないかと思い、改めてArrayの仕様を確認したところ、 & で配列の共通要素を返してくれることがわかったので、書き直した。

[4] pry(main)> (list1 & list2).present?
=> true
[5] pry(main)> (list1 & list2).empty?
=> false
[6] pry(main)> (list1 & list2).any?
=> true

値が含まれない場合の結果。

[7] pry(main)> list2 = %w(watermelon grape lemon)
=> ["watermelon", "grape", "lemon"]

[8] pry(main)> list1.any? { |f| list2.include?(f) }
=> false

[9] pry(main)> (list1 & list2).present?
=> false
[10] pry(main)> (list1 & list2).empty?
=> true
[11] pry(main)> (list1 & list2).any?
=> false

link_to の中に改行を含みたい

その1:
link_to にブロックを渡す

= link_to hoges_path, class: "foo" do
  リンクテキスト一行目
  %br リンクテキスト二行目

その2:
リンクするテキストにタグを含んでエスケープする

= link_to raw("リンクテキスト一行目<br/>リンクテキスト二行目"), hoges_path, class: "foo"
/ html_safe は nil だと例外が発生するので raw を使用する

Handsontable のサンプルを動かそうとしたらエラーになった話

Struts2のプロジェクトで、Handsontableを使用するからこのサンプル見てねー、と渡されたので動作確認したらエラーがでた。

Handsontable is not constructor

えー、と思いつつ色々ググってみたけど、決定的なのはなく。
ふと、バージョンのせいでは?と思ったら案の定だった。
サンプルで使用しているバージョンを 0.11.4 から 0.13.0 にしたら解決。
とんだトラップの仕掛けられたサンプルを渡されるとは。。

まったく同じエラーではないけど、以下が参考になった
http://stackoverflow.com/questions/20577570/meteor-error-handsontable-not-defined

hamlのシンタックスエラー

少し前からhamlを触るようになったけど、初めてだからちょっと書いてはエラー、ちょっと直してはエラー、で最近ようやく構文にも慣れてきた。

で、初めて出たエラーがこれ。

syntax error, unexpected keyword_ensure, expecting keyword_end

閉じタグとかないよなぁ、と思っていたらインデントが間違っていたという。

%ul
  - hoges.each do |h|
  %li h.name

liのインデントが足りなくて、怒られていた。

bundle exec rails を実行したときに怒られた話

ssh で本番環境に接続したあと、rails コンソールを起動しようとしたら以下のエラーが出て怒られた。

Could not locate Gemfile

本番環境だったので、エラーメッセージが出ただけでテンパる・・・慌ててググったら検索結果で気がついた。
実行する階層を間違えていただけっていうね。。
railsアプリのある階層に移動して実行したら解決。