2013年9月12日木曜日

Rails3で404エラー画面作成

RailsでRoutingErrorが出ると恥ずかしいので、404エラー画面を作ろうと思い、
どう作るんだろう?

参考
http://rochefort.hatenablog.com/entry/2013/02/25/225629

route.rbの一番最後に下記を追加
match '*path', :to => 'application#error_404'

application_controller.rbにerror_404のアクション定義。
def error_404
  error_msg = "<h2>404 Not Found</h2><p>The page you were looking for doesn't exist.</p>"
  render :text => error_msg, :status => 404
end

ここでは、render  :text=>"" にしていますが、
render :template => '/common/error_404' にして、
app/views/common/error_404.html.erb のファイルを作っても良いですね。

意外と簡単でビックリ。

BEFORE







AFTER





2013年8月30日金曜日

LoadError: no such file to load

gemは入っているのに、うまくrequireができない?!

$  gem list --local | grep mysql2
mysql2 (0.3.11)

$ irb
irb(main):001:0> require 'mysql2'
LoadError: no such file to load -- mysql2
        from (irb):1:in `require'
        from (irb):1

どうやら、先に require 'rubygems'  が必要らしい。
irb(main):002:0> require 'rubygems'
=> true
irb(main):003:0> require 'mysql2'
=> true


で、なぜこんなことが必要なんだろう?
いつもはrvmで実行してるけど、
今回は他の人のサーバに設定をすることになり、
すでにモジュールも入った状態。
Ruby One-Click Installer からインストールされた場合の設定??

2013年8月28日水曜日

`autodetect': Could not find a JavaScript runtime

Rails3.2で、railsアプリを作って、コントローラをgenerateしようとしたらエラー。
以前もハマったけど、久々に新しいアプリを作るとハマるので、メモっておく。


エラーログ
/opt/bundle/ruby/2.0.0/gems/execjs-2.0.1/lib/execjs/runtimes.rb:51:in `autodetect': Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
        from /opt/bundle/ruby/2.0.0/gems/execjs-2.0.1/lib/execjs.rb:5:in `<module:ExecJS>'
        from /opt/bundle/ruby/2.0.0/gems/execjs-2.0.1/lib/execjs.rb:4:in `<top (required)>'

対処法
Gemfileに下記2行を追加して、bundle updateをすればOK
gem 'therubyracer'
gem 'execjs'

2013年8月26日月曜日

ハッシュキーをシンボルに変換

ハッシュをJSONファイルにして、また戻しての時にハマったのがキー。
JSONファイルにした後に読み込むとシンボルが文字列になってしまうんですね。
他にもいろいろそんなケースが出てきそうなんですが。

Railsの機能にあるHashキーをシンボルに変換するsymbolize_keys
> {"a" => 1, "b" => 2}.symbolize_keys
=> {:a=>1, :b=>2}


JSON.parseでJSONを読み込んでハッシュのキーをシンボルにする場合は、:symbolize_namesのオプションを付与。
>hash = {"a" => 1, "b" => 2}
=> {"a"=>1, "b"=>2}
> json = hash.to_json
=> "{\"a\":1,\"b\":2}"
> JSON.parse(json)
=> {"a"=>1, "b"=>2}
> JSON.parse(json,  {:symbolize_names => true})
=> {:a=>1, :b=>2}

2013年7月9日火曜日

svn dump & load

SVNのダンプとロードについてのメモ。

DUMP
incrementalの有り無しの違いがちょっと分かりづらかったので、
いろいろ聞いてメモっておく。

すべてのダンプをダンプするコマンド
svnadmin dump /opt/svn/xxx > xxx.dump

リビジョン指定の差分ダンプのコマンドにはオプションを付ける。
リビジョン指定+incrementalオプションなし
(100から最新のHEADまで。HEAD以外にも適当なリビジョンの指定も可能)
svnadmin dump /opt/svn/xxx -r 100:HEAD" > diff.dump

リビジョン指定+incrementalオプションあり
svnadmin dump /opt/svn/xxx --incremental -r 100:HEAD" > diff.dump

incrementalありとなしの違いは、incrementalありの場合は、上記例で行くとrev99と100の差分からになる。
incrementalなしだと全ファイルが含まれるため、サイズも大きくなる。
incrementalなしだと、前revがロードされていなくても構築できる(はず)。

LOAD

最初から全部ロードする場合
svnadmin load /opt/svn/yyy < xxx.dump
 
特定のフォルダにロードする場合は、parent-dirのオプションを追加
svnadmin load /opt/svn/yyy --parent-dir /zzz < xxx.dump