申し訳ありません、このコンテンツはただ今 English のみです。
「gem」タグアーカイブ
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
クラス に次のコードを追加します。
1 2 |
def self.helper_method(*) end |
なにもしないメソッドですが問題ありません。 Cells 3 の時は self.helper_method
を呼ぶ必要があったのですが、 Cells 4 からは 使わなくてもよくなり、 メソッドも削除されたそうです。
dom_class
でエラー
次のようなエラーが出た場合。
undefined method `dom_class’ for #<XyzCell:0x007ff36d4fecb0>
Cell
クラス に 次のコードを追加します。
1 2 3 4 5 6 7 |
def dom_class(record, prefix = nil) ActionView::RecordIdentifier.dom_class(record, prefix) end def dom_id(record, prefix = nil) ActionView::RecordIdentifier.dom_id(record, prefix) end |
数字の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
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 のアプリケーションにテストコードは一切ありませんでした。
リリース前のプログラムに対して変更を行いました。
やったこと
- ApplicationCell 作成
- helper を include に変更
- render_cell を cell に変更
- ファイル名変更
- app/views 内のテンプレート呼び出し部分を変更
ApplicationCell 作成
cell のテンプレートの中で device 関連のメソッドを使っていたり、 フォームタグ関連のメソッドを使っていると途端に動かなくなります。 そこで、 ApplicationCell
を作成して 全ての Cell がそれを継承するように変更しました。
アプリケーションを見ながら 次のような ApplicationCell
を作りました。 include
で取り込んでいるモジュールは、 エラーが出る度に順次取り込んでいったものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class ApplicationCell < Cell::ViewModel include Cell::Slim include ActionView::Helpers::DateHelper include ActionView::Helpers::TextHelper include ActionView::Helpers::NumberHelper include ActionView::Helpers::FormHelper include ActionView::Helpers::FormOptionsHelper include ERB::Util def self.helper_method(*) end def dom_class(record, prefix = nil) ActionView::RecordIdentifier.dom_class(record, prefix) end def dom_id(record, prefix = nil) ActionView::RecordIdentifier.dom_id(record, prefix) end end |
self.helper_method
は devise
が呼び出しているため、 呼べるようにしておくために作っています。 Cells では 既に意味のないメソッドになっているので、 何も処理は行いません。 この記述については 一部 Rails: Cells 3 から Cells 4 への アップグレード時に遭遇したエラー にも関連情報を書きました。
helper を include に変更
各 Cell クラス に helper ApplicationHelper
というのが記述されていました。
Webrick を実行してページを開くと undefined method と表示されました。 そこで、 helper
を include
に変更しました。
sed
コマンドを使って、 複数ファイルを一度に変更しました。
render_cell を cell に変更
Cells 4 から メソッドが変わりました。 ビューの中で使用されている render_cell
を cell
に書き換えました。
いままで書いていた人がコードを綺麗に保っていたので、 sed
コマンドを使って簡単に変更できました。 書き方が何通りもある場合は、簡単にはいきません。
変更前コード
1 |
= render_cell :cell_name, :method_name, option_1: 1, option_2: 2 |
変更後コード
1 |
= cell(:cell_name).(:method_name, option_1: 1, option_2: 2) |
ファイル名変更
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
を呼び出していました。
変更前コード
1 |
= render partial: 'shared/something', locals: {something: true} |
この呼び出し方だと、 Cells 4 ではうまくいきません。
cells/lib/cell/templates.rb
と cells/lib/cell/view_model.rb
を見ながら次のようにコードを変更しました。
変更後コード
1 |
= render prefixes: ['app/views'], view: 'shared/_something.html', locals: {something: true} |
prefixes
と view
を作るだけではなくて、 view
の値も変える必要があります。
app/views
内のテンプレートを呼び出す際のメソッドを ApplicationCell
に作ったほうがよかったかもしれません。
Cell の中に self.view_paths += ['app/views']
を加えると、 app/views/cell_name
の中でテンプレートを探すようになります。 つまり、次のように変更しても動くようになります。
コード変更案
1 |
= render view: '../shared/_something.html', locals: {something: true} |
rails で sitemap を作成する gem
Ruby で サイトマップ を作成する gem を紹介します。
sitemap_generator
sitemap_generator を使うと、サイトマップが簡単に作成できます。 Ruby だけでも使えます……が、ここでは Rails の上で私が使用した方法を紹介します。
使用方法
環境は次の通りです。
- Ruby 2.0.0p451
- Rails 4.1.0
- sitemap_generator 5.0.2
Gemfile
にsitemap_generator
を 追加してbundle install
します。rake sitemap:install
を実行します。config/sitemap.rb
というファイルが作成されます。- このファイルに記述したサイトマップ生成スクリプトは rake sitemap:refresh によって更新されます。
config/sitemap.rb
が作成される他は特になにも起こりません。sitemap_generator
のtasks.rb
を覗いてみるとよくわかります。
sitemap.rb
を編集します。- デフォルトでは ルート(“/”)へのサイトマップが3つ作成されます。 それら3つは
changefreq
が異なりますが、いらないので削除します。 コード内にSitemapGenerator::Sitemap.include_root = false
を記述します。 SitemapGenerator::Sitemap.create_index = true
を記述して、サイトマップのリストを作成します。- サイトマップの作成を
ping
で通知します。 Google と Bing に届くように設定します。 Yahoo! は Google と検索エンジンが同じであるため Yahoo! の設定は必要ありません。123SitemapGenerator::Sitemap.ping_search_engines(:google => 'http://www.google.com/webmasters/tools/ping?sitemap=%s',:bing => 'http://www.bing.com/webmaster/ping.aspx?sitemap=%s') lastmod
,priority
,changefreq
などを出力したくない場合には、それぞれの値にnil
を設定します。rake sitemap:refresh
が実効されるように、crontab
に記述します。
- デフォルトでは ルート(“/”)へのサイトマップが3つ作成されます。 それら3つは