ラベル Rails の投稿を表示しています。 すべての投稿を表示
ラベル Rails の投稿を表示しています。 すべての投稿を表示

2015年5月14日木曜日

アセットコンパイル時に Sprockets::FileNotFound: couldn't find file 'bootstrap-sprockets' が出たときの対策

Railsのアプリケーションにbootstrap-sassを導入して、bootsrapのバージョンを2から3にした。
開発環境では問題なく動いていたのに、本番にいれるためのアセットコンパイルをしようとすると下記のエラーが。

[goy@myserver]$ RAILS_ENV=production bin/rake assets:precompile
/usr/local/bin/ruby bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
rake aborted!
Sprockets::FileNotFound: couldn't find file 'bootstrap-sprockets'
  (in /deploy/mysite/app/assets/javascripts/application.js:14)
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/sprockets-2.1.4/lib/sprockets/context.rb:100:in `resolve'
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/sprockets-2.1.4/lib/sprockets/context.rb:140:in `require_asset'
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/sprockets-2.1.4/lib/sprockets/directive_processor.rb:215:in `process_require_directive'
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/sprockets-2.1.4/lib/sprockets/directive_processor.rb:165:in `block in process_directives'
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/sprockets-2.1.4/lib/sprockets/directive_processor.rb:163:in `each'
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/sprockets-2.1.4/lib/sprockets/directive_processor.rb:163:in `process_directives'
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/sprockets-2.1.4/lib/sprockets/directive_processor.rb:97:in `evaluate'
/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/tilt-1.4.1/lib/tilt/template.rb:103:in `render'


いろいろ調べた結果どうもアセットコンパイル対象のパスにbootstap-sassが入っていないようだ。


irb(main):001:0> Rails.application.config.assets.paths
=> ["/deploy/mysite/app/assets/images", "/deploy/mysite/app/assets/javascripts", "/deploy/mysite/app/assets/stylesheets", "/deploy/mysite/vendor/bundle/ruby/1.9.1/gems/jquery-rails-3.1.2/vendor/assets/javascripts"]

⇒bootstrap-sass がはいってない。

config/environments/production.rb に bootstrap-sassをアセットコンパイルの対象にするように追記。

Rails.application.config.assets.paths << Rails.root.join( "vendor/bundle/ruby/1.9.1/gems/bootstrap-sass-3.3.4.1/assets/javascripts" ).to_s Rails.application.config.assets.paths << Rails.root.join( "vendor/bundle/ruby/1.9.1/gems/bootstrap-sass-3.3.4.1/assets/stylesheets" ).to_s

# しかしバージョンがハードコードされてしまっているという問題があり。


[goy@myserver]$ RAILS_ENV=production bin/rake assets:precompile
/usr/local/bin/ruby bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
[goy@myserver]$

⇒今度はエラーなくコンパイルできた!


いつもはデプロイはcapistranoを使うのでbin/rake assets:precompileを直に実行することはない。
今回のサイトはあまり更新しないのでcapistranoを設定してなかったのだが、capistranoがアセットコンパイルを実行するときにはどうしているのだろう。
実行時にパスを渡すとかするのだろうか。。。


2015年4月12日日曜日

Mroonga導入してみた。mroonga_snippetがうまく動かない。

mroongaを入れてみた。
Railsで作っているディレクトリサービスサイトの検索機能をリニューアルしようと導入中。

使いはじめは簡単で、データを入れて FULLTEXTインデックスを張れば
すぐに全文検索できるようになった。

まだいつも間違ってしまうのが、例えば サイト名と、紹介テキストをそれぞれ、name,
descriptionカラムに持つテーブルがあるとして、FULLTEXTインデックスを(name, description)に対して張った場合、
SELECT時AGAINST句で両方のカラムを指定しなければいけないこと。

Googleでもそうだけど検索結果のテキストで該当部分を目出させるようにしたい。
mroonga_snippetを使うとそういうことができるのだろうけど、試してみるとwordNに日本語を指定したら

Can't initialize function 'mroonga_snippet'; Failed to add a condition to grn_snip: <>

とメッセージをだしてエラーになった。

まぁ実験的機能ということだしまだなのかな。しかし国産なのに日本語がだめとは。。。

ではどうするか。


Modelの方で、該当文字列をspanタグで囲って返す処理を作った。


def description_for_search_result keyword

desc = self.description.strip

first_pos = desc.index( keyword )
first_pos = 0 if first_pos.nil?
max_length = 200
prefix = "..."

if first_pos <= 5 start_pos = 0 elsif desc.length - first_pos < max_length start_pos = desc.length - max_length else start_pos = first_pos end start_pos = 0 if start_pos < 0 prefix = "" if start_pos == 0 postfix = "" if start_pos + max_length < desc.length postfix = "..." end text = self.description[ start_pos, max_length ] text = text.gsub(/(#{keyword})/, %!\\1!)

dum = start_pos + max_length
ret = %!#{prefix}#{text}#{postfix}!.html_safe

end


はじめに対象文字列があった場所から、200バイト分を出力。
抽出される文字列が200バイトより少なくなるようなら、開始位置を調整。
紹介分自体が200文字より短いなら全文を表示。
表示の前後で省略される部分があるなら「...」を表示。

該当箇所はで囲まれてでてくるので、
CSSで目立つようにしてやる。


まぁこれでいったんいいんだが、
mroongaの結果では「すぽーつ」で検索しても「スポーツ」を含む結果が
返されるが、この置き換えメソッドは強調できない。

カタカナ、ひらがな程度なら対応もできるが、自然言語検索した場合は
どうしようもない。検索結果毎に処理が走るのもできれば避けたいし、早くmroonga_snippetが
使えるようになったほしい。