Tag Archives: Rails

Symbol not found: _rb_Digest_SHA1_Finish (LoadError)

Tagged , ,

Mac OS 10.7.3環境で、rvmを使ってruby 1.9.3を入れたところ、 以下のエラーで、bundle install出来ませんでした。 Unfortunately, a fatal error has occurred. Please report this error to the Bundler issue tracker at https://github.com/carlhuda/bundler/issues so that we can fix it. Please include the full output of the command, your Gemfile and … Continue reading

Xcode 4.3環境にRVMでREEをインストールする

Tagged , , , , ,

LionのXcode 4.3をインストールした環境で、RVMを使用してREEをインスト—ルしようとしたところ、以下のようなエラーが出ました。 ERROR: Error running ‘./installer -a /Users/annotunzdy/.rvm/rubies/ree-1.8.7-2011.03 –no-tcmalloc –dont-install-useful-gems ‘, please read /Users/annotunzdy/.rvm/log/ree-1.8.7-2011.03/install.log ERROR: There has been an error while trying to run the ree installer. Halting the installation. ログファイルを見ると、 ./ext/purelib.rb:2: [BUG] Segmentation fault gcc 4.7 と書かれており、どうやらビルドに失敗しているようでした。 調べてみると、Xcode 4.3からLLVMのgccのみがインストールされるようになったのですが、 … Continue reading

ActiveRecordのモデルに対してto_hashを出来るようにする。

Tagged ,

モデルの中身をJSONとして出力する前段階として、 モデルの中身をハッシュとして扱いたかったのですが、標準でハッシュに変換する方法が見つかりませんでした。 そのため、to_hash関数を自分で追加することにしました。 モデルクラスに以下のコードを追加: def to_hash ActiveSupport::JSON.decode(self.to_json) end これで、 「モデルオブジェクト.to_hash」 でいつでもハッシュ化できます。 ただこれだと、関連しているテーブルを追いかけてくれるわけではないので、まだ少し不便だったりもします。 もっと良い方法もあるかもしれません。 追記 (12/03/02): こっちのほうが良さそうです。(情報提供ありがとうございます!) def to_hash Hash[*self.map{ |i| [i.id, i]}.flatten] end

RailsからPDFを出力できる「ThinReports」がすごい

Tagged , ,

RailsからPDFの出力が出来る、ThinReportsというライブラリがありました。 Mac / Windows / Linuxに対応したGUIのエディタを使い、簡単にテンプレートを作ることができ、 そこに、Railsのデータを流し込んで簡単にPDF出力の仕組みを作ることができます。 まだ細かいところまで見ていませんが、これは結構便利かも。 情報提供者:小川さん

[RVM] OpenSSL等が入っているのにgemのインストールに失敗する場合の対処法

Tagged , , ,

RVM環境のgemにおいて、 openssl, libxml2, zlibなどが見つからないというエラーで、一部のgemがインストール出来ないことがありました。 どうやら、RVMをインストールした後にaptitude,yum等でopenssl, libxml2などをインストールした場合、RVM側においてそれらのパスが認識できないようです。 RVMのインストールし直しでも解決するかもしれないですが、もっと簡単な方法があったのでメモ。 こちらのページによると、 OpenSSLなどの一部のライブラリについては、以下のコマンドで、rvm内にインストールが出来るようです。 rvm pkg install ライブラリ名 このコマンドで必要なライブラリをインストールした後、 rvm reinstall 1.9.3 のように、rubyを再インストールすれば完了です。 これで無事、各ライブラリに依存するgemをインストールできました。 rubyの再インストールが必要になるので、基本的なライブラリはこのコマンドを使って先にインストールしておくと良さそうです。

RailsのActionMailerで、RFC違反の携帯アドレスにメールを送る

Tagged , , ,

ActionMailerは、内部でヘッダーを割と厳密にパースしているため、RFC2822違反のアドレスを渡すと送信できません。 Takao Baba <baba@example.com> のような形式のTOアドレスを適切に処理できるようになっているので、大変便利なのですが、 example…@docomo.ne.jp のような不正なアドレスは、TOと解釈されず(内部的にToFieldではなくCommendFieldと解釈される)、送信時にエラーが発生します。 真面目に対処しようとすると、YACCを書いてパーサーを差し替えるということになるのですが、正直面倒です(先人たちが色々やってくれていますが、バージョン依存性が以外と強いので、ActionMailer3系に綺麗に対応しているものが少なかったりします)。 ActionMailer3では、TOのアドレスをダブルコーテーションで囲ってしまえば、とりあえず動作はするので、簡単なパッチを当ててみましょう。 # -*- coding: utf-8 -*- # RFC2822違反の不正なメールアドレス(携帯)を許可するため、 # Toに設定するアドレスをすべてダブルコーテーションで囲む require ‘mail’ require ‘mail/header’ module Mail class Header alias original_set_bracket []= def []=(name, val) if name.to_s =~ /to/i if val.kind_of?(Array) val = … Continue reading

jpmobile環境下で、カスタムセッションストアを使う場合

Tagged , ,

Railsでは、セッションストアとしてデフォルトではCookieStoreを使用します。ActiveRecordStoreを使う機会も多いと思います。 セッションストアの動作を変更したい場合、モンキーパッチを当てる方法もありますが、継承してしまうのが一般的かと思います。 # config/initializers/a_session_store.rb MyApp::Application.config.session_store :my_active_record_store MyApp::Application.config.session_options = {:cookie_only => false} require ‘action_dispatch’ module ActionDispatch module Session class MyActiveRecordStore < ActiveRecord::SessionStore # 何かオーバーライドする end end end ところでこの場合、jpmobile(2.0.5)のtrans_sidがうまく動かなかったりします。 jpmobileはApplication.config.session_store.to_sが"ActiveRecord::SessionStore"かどうかを見て判断するため、継承したらダメなのですね。 手動で設定してあげるのが、簡単そうです。 # config/initializers/jpmobile_init.rb require 'jpmobile' MyApp::Application.config.jpmobile.mobile_filter MyApp::Application.config.jpmobile.form_accept_charset_conversion = true module Jpmobile::TransSid require … Continue reading

Railsアプリケーションをプロファイリングしよう

Tagged ,

ruby-profを使うと、Railsアプリケーションも簡単にプロファイリングすることが出来ます。 手順は簡単。 まず、Gemfileに追加します。 gem ‘ruby-prof’ gem ‘rack-contrib’ bundle installしたら、config.ruに以下の記述をします。 # 特定environmentのみで有効にしたい場合、 # if ENV['RACK_ENV'] == ‘development’ などすると良いです require ‘ruby-prof’ Rack::RubyProf = RubyProf #エラー対策 require ‘rack/contrib/profiler’ use Rack::Profiler, :printer => :graph_html require ::File.expand_path(‘../config/environment’, __FILE__) run MyApp::Application これでサーバを再起動したら、 http://localhost:3000/hoge?profile=process_time のように、URLに?profile=process_timeをつければ、HTMLでプロファイリング結果が表示されます。 大変便利ですね。 エラー対処 … Continue reading

Railsでカスタムmimeタイプを使った場合、respond_withがMissing Templateを吐いてしまう

Tagged ,

Rails開発で、PCとスマートフォンでViewを分けたい場合、formatを変更する、というのは常套手段ですね。 たとえばiphoneというformatを使う場合、 # config/initializers/mime.rb Mime::Type.register_alias “text/html”, :iphone # app/controllers/application_controller.rb class ApplicationController < ActionController::Base before_filter :set_iphone_format def set_iphone_format request.format = :iphone if ENV["HTTP_USER_AGENT"] =~ /iphone/i end end このようなコードで、自動的にindex.iphone.erbが検索されるようになります。 しかしこれだと、respond_withを使った場合に問題が発生します。 たとえば、ユーザ認証プラグインdeviseの内部では、以下のような(かなり省略しています)コードが実行されています。 def update #validationエラーの場合など respond_with(@user) { render :edit } end この場合、formatが:htmlの場合は、editアクションがrenderされるのですが、formatが:iphoneの場合、Missing Templateが発生してしまいます。 … Continue reading

deviseで使うモデルにfind_by_で始まる名前のscopeを定義するとrake db:migrate:resetが通らない

Tagged ,

rake db:migrate:resetが通らないという現象に見舞われました。 エラーメッセージは rake aborted! Mysql2::Error: Table ‘myproject.users’ doesn’t exist: SHOW FIELDS FROM `users` 環境は Rails 3.1.0 + Ruby 1.9.2 + devise 1.5.0 です。 原因は、Userモデルに定義した次のスコープでした。 # app/models/user.rb class User < ActiveRecord::Base scope :find_by_hoge, lambda{|val|    joins(:foo).where(“foos.hoge_id” => val   } end # … Continue reading