なんとなく日々徒然と

simple_formで表示されるエラーをfull_messagesのものにする

1
2
3
#開発環境
rails (4.2.1)
simple_form (3.1.0)

simple_formをそのまま使うとエラー発生時のエラーの表示がfull_messageではなく、object.errors[:name]みたいにした時の値しか表示してくれない。

こんな感じ。
normal error

ちょっとこれだとあんまりなのでfull_messageでメッセージを表示したい

railsでuser_idをurlに付与して引き回す方法

特定のパラメータを常にurlに付与する方法です。

urlにuser_idをクエリなどにふくめておくとgoogle analyticsとか使った時に、特定のユーザがどういうページにアクセスしたかわかりユーザの行動分析に使えたりします。

なのでurlに自動でuser_id=[:user_id]の形式でアクセスしてるページのuser_idが付与されると非常に便利そうです。

参考になったのはjpmobileのソースでした(docomo端末の場合にguidを自動付与したりしています)
docomo_guid.rb

Deviseで特定の条件のみパスワードの検証をスキップする

1
2
3
#開発環境  
rails 4.2.1  
devise 3.4.1  

deviseを使っていて、ユーザモデルに仮登録状態を作りたいと思います。
仮登録の段階ではパスワードはまだ要求されず。
最後の最後でパスワードを設定して本会員登録完了といったフローです。

deviseでは対象モデルにdevise :validatableに設定している場合はメールアドレスやパスワードの検証が走ります。
今回はパスワード以外のチェックはやってほしいため:validatableの宣言を外すだけではダメです。

deep_rejectが欲しくてrefinementsで実装しようとした話

再帰的に条件判定を行うrejectが欲しくなりました。
こういう動きです。

1
2
3
4
5
6
7
8
[1,2].deep_reject{|val| val == 1 }  # => [2]

[1,2, [1,2,3]].deep_reject{|val| val == 1 } # => [2, [2, 3]]

[1, 2, {a: "a", b: "b" }].deep_reject{|key, val| key == :a } # => [1, 2, {:b=>"b"}]

[1, 2, {a: "a", b: "b", c: {a: "c", c: "d"} }].deep_reject{|key, val| key == :a } 
# => [1, 2, {:b=>"b", :c=>{:c=>"d"}}]

かなり便利そうです。

モデルのattributeに変更がなくてもnested_attribute_forを使っているモデルでcallbackを発生させる

任意の条件でnested_attribute_forの対象の保存処理を走らせる方法です

ファイルのアップロード用のモデルを作っていてActionDispatch::Http::UploadedFileを一旦attr_accessorのアクセサで受けたあとcallbackでファイル名やファイルサイズをmodelクラスの該当のカラムに設定するという処理を書いておりました。

ファイルは可変にアップロードしたかったのでこのモデルの親モデルから参照するようにして、nested_attribute_forで親モデル更新時に一緒に更新するようにします。

1
2
3
4
5
class Oya < ActiveRecord::Base
  has_many :files, dependent: :destroy

  accepts_nested_attributes_for :files, allow_destroy: true
end
1
2
3
class File < ActiveRecord::Base
  attr_accessor :file
end

Rails Engineを使った開発

一つ前に携わったプロジェクトではサブシステムがたくさんあり、それぞれがrailsで構築されていて共通処理やmodelはrails engineにあつめられ各システムで参照しておりました。

今までgemのコードリーディングをする時にしか意識していなかったrails engineですが(deviseとかとか)、結構便利だということを今更ながら実感し、最近は共有処理をengineに書き出してそれを参照するようにしています。

クックパッドさんでも共通部分をengineに集めているようです。
新規サービスの管理画面を短期間で見栄え良く実装する

ドリコムさんでは複数のengineを組み合わせてシステムを作っているようです。
Mountable Engine だらけの Rails アプリ開発

Railsでbootstrap datetimepickerを日本語化しつつ導入(with rails assets)

普段はよく bootstrap-datepickerを使うのですが、 今回の案件では時刻まで絞り込みたいというお話だったのでdatetimepickerを導入してみました。

こちらを使います。かなり高機能な上に日本語化まで対応できる優れもの。
Eonasdan/bootstrap-datetimepicker

デモを見るだけでもワクワクしますね。
入れ方もたくさん用意されていていいですね。
今回もrails-assetsで導入します。

pecoでctrl+jとctrl+kで上下移動

pecoをランチャーとして使っているのですが、
メニューを呼び出した後ホームポジションから手を離して矢印キーに指を運ぶのが嫌でctrl+jとctrl+kで移動できないかと思っていたら会社の人にやり方を教えてもらいできました。

具体的にはpecoの キーマップを使います

Railsでbootswatch導入(with rails assets)

管理画面を作るにあたって bootstrapだけで1から作るのもしんどかったので、フリーのbootstrap用テンプレート bootswatchを使って管理画面を作ってみたいと思います。

導入には以下4パターンがあるかと思います。

  1. bootswatch-railsなどのGemを使う
  2. bowerで入れる
  3. rails-assetsで入れる
  4. サイトからダウンロードしてassets下に配置する

今回はrails-assetsで導入してみました。