Kenji のすべての投稿

Rails: Cells 3 から Cells 4 への アップグレード時に遭遇したエラー


gem の Cells 3 を Cells 4 にアップグレードした際に遭遇したエラーと対処法を記録しておきます。 すべてではないです。 ここにある対処法は、 それぞれの Cell クラス に対して行ってもいいですが、 ApplicationCell という親クラスを作ってそこに書き込むのが楽です。

対処した最終結果は Rails: Cells 3 から Cells 4 へのアップグレード に記載しています。

helper_method がないというエラー

lib/devise/controllers/helpers.rb で次のようなエラーが出ます。 そのとき私が使っていた devise のバージョンは 3.5.2 です。

undefined method `helper_method’ for XyzCell:Class

Cell クラス に次のコードを追加します。

なにもしないメソッドですが問題ありません。 Cells 3 の時は self.helper_method を呼ぶ必要があったのですが、 Cells 4 からは 使わなくてもよくなり、 メソッドも削除されたそうです。

参考: apotonick/cells Issue Not working with react-rails

dom_class でエラー

次のようなエラーが出た場合。

undefined method `dom_class’ for #<XyzCell:0x007ff36d4fecb0>

Cell クラス に 次のコードを追加します。

参考: apotonick/cells Troubleshooting

数字の3桁区切り number_with_delimiter がなくてエラー

Cell クラス に include ActionView::Helpers::NumberHelper を追加します。

select タグ が使えなくてエラー

次のようなエラーメッセージが出ます。

private method `select’ called for #<XyzCell:0x007ff48f4febe8>

Cell クラス に include ActionView::Helpers::FormOptionsHelper を追加します。

参考: apotonick/cells Issue select form_helper doesn’t work in cells 4


東銀座 じゃのめ 500円 でうどん・天丼を食べる


東銀座 にある 銀座 じゃのめ 銀座三丁目店 にて、 500円 で天丼を食べてきました。 ものによって 390円 だったり 500円 超えたりする お店です。

じゃのめ 500円 天丼

ごはんが少ないように見えるかもしれませんが、(うつわ)が深くてごはんもどっさり入っています。

続きを読む 東銀座 じゃのめ 500円 でうどん・天丼を食べる

Rails: Devise エラー undefined method `failure_app’ for nil:NilClass の対処法


API を作っていたとき、 次のようなエラーが出ました。 原因は devise gem でした。

NoMethodError (undefined method `failure_app’ for nil:NilClass)

環境

  • Ruby 2.2.3p173
  • Rails 4.2.4
  • devise 3.5.2

原因

unauthorized のユーザに対して sign_in を実行していました。

作成中の API では、 いちいちメールの確認をしなくてもログイン・利用はできるようにしておく方針だったため、 メール未登録のユーザでもログインする処理を記述していました。 そのため、 通常なら warden の上で unauthorized とみなされるユーザについてもログイン処理を行っていました。

対処法

config/initializer/devise.rb で次のように設定を行うと解決します。

ほかに、次の記述を devise で認証を行うモデルクラスに入れるという方法があります。 たとえば User クラスなど。

意味を考えると 後者のほうが望ましいと思います。

confirmation_period_valid?

メソッド confirmation_period_valid? は devise のモジュール Devise::Models::Confirmable で定義されています。


銀座で毎日のランチを平均550円未満に抑える方法


銀座周辺で毎日のランチを平均550円未満に抑える方法を書きます。 ワンコインランチを探すというのも手なのですが、 今回は ワンコインではないランチを考えます。

PREMIUM PASS を買うと、毎日のランチを平均550円以下に抑えることができます。

仕組み

PREMIUM PASS vol. 3 があれば、 500円 のランチが 29回 食べられる計算になります。 (13:00 以降 でないと使えないものを除くと、 21回 食べられる計算になります。)

1か月のうち、 ランチを外で食べるのは (私の場合)だいたい 20回 です。 要するに 20日全日、 500円でランチを食べられることがわかります。

PREMIUM PASS vol. 3 の価格が 980円 ですから、 ( ( 980 + 500 times 20 ) div 20 = 549 ) 円 で毎日のランチが食べられる計算になります。

仮に PREMIUM PASS に載っているお店に行かなくても、 500円 のランチを食べるんだったら 平均して ランチのコストは同じになります。

470円 で食べられる蕎麦(そば)もありますが、 そういったものばかりではいやになる、 だけど高いランチはいやだという方におすすめの一冊です。

PREMIUM PASS 銀座グルメパスポート vol. 3
PREMIUM PASS 銀座グルメパスポート vol. 3

今は東銀座で働いていますが、 東銀座からでも徒歩で行ける範囲のお店が多く載っています。 銀座、銀座1丁目、新橋、東銀座あたりで働いている方におすすめです。

他のエリア

新宿など、他のエリアでも同じような冊子が売られています。 東京だけでなく他の都道府県のもありますので、「ランチパスポート」を Amazon で検索 してみてください。


Rails: Cells 3 から Cells 4 へのアップグレード


Rails のアプリケーションで Cells gem を 3.11.3 から 4.0.2 にアップグレードしました。 一緒に Rails も 4.1.9 から 4.2.4 にアップグレードしました。 ここでは Cells についてやったことを書きます。

基本的なやり方は From Cells 3 to Cells 4 Upgrading Guide に説明がありますので ご参照ください。 バージョン 4 に変更するのは結構大変です。

環境

  • Ruby 2.2.3
  • テンプレートエンジン: Slim

経緯

ある人が外注に出していたプログラムを なぜか私がデザイン、マークアップ含めて更新することになり、 Rails と Gem のバージョンを更新しました。

その Rails のアプリケーションにテストコードは一切ありませんでした。

リリース前のプログラムに対して変更を行いました。

やったこと

  1. ApplicationCell 作成
  2. helper を include に変更
  3. render_cell を cell に変更
  4. ファイル名変更
  5. app/views 内のテンプレート呼び出し部分を変更

ApplicationCell 作成

cell のテンプレートの中で device 関連のメソッドを使っていたり、 フォームタグ関連のメソッドを使っていると途端に動かなくなります。 そこで、 ApplicationCell を作成して 全ての Cell がそれを継承するように変更しました。

アプリケーションを見ながら 次のような ApplicationCell を作りました。 include で取り込んでいるモジュールは、 エラーが出る度に順次取り込んでいったものです。

self.helper_methoddevise が呼び出しているため、 呼べるようにしておくために作っています。 Cells では 既に意味のないメソッドになっているので、 何も処理は行いません。 この記述については 一部 Rails: Cells 3 から Cells 4 への アップグレード時に遭遇したエラー にも関連情報を書きました。

helper を include に変更

各 Cell クラス に helper ApplicationHelper というのが記述されていました。

Webrick を実行してページを開くと undefined method と表示されました。 そこで、 helperinclude に変更しました。

sedコマンドを使って、 複数ファイルを一度に変更しました。

render_cell を cell に変更

Cells 4 から メソッドが変わりました。 ビューの中で使用されている render_cellcell に書き換えました。

いままで書いていた人がコードを綺麗に保っていたので、 sedコマンドを使って簡単に変更できました。 書き方が何通りもある場合は、簡単にはいきません。

変更前コード

変更後コード

ファイル名変更

cell のテンプレートが method_name.html.slim となっていましたが、 cell(:cell_name).(:method_name) で呼び出した場合、 method_name.slim のテンプレートを探してエラーとなりました。

cells/lib/cell/view_model.rb 内の find_template メソッド でテンプレートの名前を組み立てていますが、 そこでは 文字列 'html' を結合していません。

そこで、 テンプレートファイルの名前から html を抜きました。

app/views 内のテンプレート呼び出し部分を変更

こちらも間に合わせの対応でした。

過去のコードでは過去のコード cell のテンプレートから app/views/shared/something.html.slim を呼び出していました。

変更前コード

この呼び出し方だと、 Cells 4 ではうまくいきません。

cells/lib/cell/templates.rbcells/lib/cell/view_model.rb を見ながら次のようにコードを変更しました。

変更後コード

prefixesview を作るだけではなくて、 view の値も変える必要があります。

app/views内のテンプレートを呼び出す際のメソッドを ApplicationCell に作ったほうがよかったかもしれません。

Cell の中に self.view_paths += ['app/views'] を加えると、 app/views/cell_name の中でテンプレートを探すようになります。 つまり、次のように変更しても動くようになります。

コード変更案