form_tagを使えばブロック内の全体を返してくれるかと思ったのですが、そうではないらしく最終行だけ返ってきてしまいます。

具体例

つまり

だとフォームそのものと最終行のsubmit_tagだけが表示されてその他の入力フィールドが一切表示されません。

対策

なので以下のように毎行Stringを保存しておきましょう。何でこんな仕様になってるんだろう…?

参考

ruby on rails – How do I use form_tag from within a helper? – Stack Overflow


日付の配列がある時に

現在の日付よりも新しく、かつ一番近い日付を選択したい時の処理

findメソッドはやっぱり便利!


Railsで既にindexをつけているカラムにunique制限をもうけるには、ユニーク制限だけを付加することができないので一旦インデックス自体を削除してから新規に unique な index を追加します。

参考

ruby on rails – How to add unique constraint to already existing index by migration – Stack Overflow


Rubyの命名規則としてクラス名は通常はCamelCaseで記述しますが、HTTPなどの頭字語(Acronym)はそのまますべて大文字で記述します。

Railsで頭字語のクラス名を使うときはモデル等を生成する前に設定で以下の記述を行っておくと自動的に認識してくれます。

ただhas_manyでこのクラスを持とうとすると以下のエラーになってしまいます。

LoadError: Unable to autoload constant Gnu, expected
/Users/ironsand/dev/myproject/app/models/gnu.rb to define it

対策

クラス名を明示的に指定するとOKです。


Selenium-WebDriverNokogiriで同じファイルを開いても違うxpathを書かないといけないとダメで少しハマったのでメモ。

違いの原因

同じHTMLを解析してもSelenium-WebDriverChromeFirefoxで開いた時は任意の要素であるtbodyが挿入されるために違いが発生します。

実際の例

例えば

とある時に

Nokogiri の場合

Selenium WebDriver の場合

基本的な対策

大体の場合は//table//trとどちらにも対応できるように書いたらいいわけですが、汚いHTMLを解析するときに

//tr/td/font[contains(text(), 'Keyword')]/../../following-sibling::tr[3]/td

な感じで正確なタグの数が必要になることがあるのでそういう時に気をつけましょう。

参考

ruby – How to get element that have same parent and n th different position by xpath – Stack Overflow


こんなふうにファイルを読み込むと標準では改行が入ってしまいます。

解決策

改行はいらないので消しちゃいましょう。


例えば foo.rbというRubyスクリプトの実行時間をシェル上で知りたかったらtime foo.rbとすればいいわけですが、残念ながらirb上ではtimeコマンドをそのまま使うことができません。

解決策

標準で用意されているBenchmarkライブラリを使えばOK.

こんな感じで表示されます。

0.750000がCPUを使った時間で0.835234が実際にかかった時間。
気にしないといけないのはCPUを実際に使ってたじかんなので前者のほうになります。

ちなみに自分の環境だと裏で動画のエンコードを走らせながらVirtualBox上のOSでやってたのでCPU使用時間の50倍ぐらい実際にかかってしまってました。

参考

Module: Benchmark (Ruby 2.1.1)

When benchmarking, what causes a lag between CPU time and "elapsed real time"? – Stack Overflow


RailsでPostgresqlを使うときに毎回そのためのユーザーの作成方法を忘れてしまうのでメモ。

まずユーザーを作成

WindowsでChocolateyを使ってpostgresqlをインストールしてると初期パスワードはPostgres1234になってるので、

これでパスワード無しのdeployerユーザーが必要な権限付きで作成される。

※ Linux系のOSならsudo -u postgres psqlpsqlコマンドを使いましょう。

パスワード無しユーザーでもOKにする

これだけだとfe_sendauth: no password suppliedというエラーが出てしまうので

C:\PostgreSQL\data\pg_hba.confを開いて

に書き換える。

んで管理者権限でコンソールを開いて

net stop postgresql
net start postgresql

Postgresqlのサービスを再起動させる。
残念ながらrestartは存在しない。なんでや。

Rails側の設定

あとはいつもどおりconfig/database.ymlをこんなかんじに設定します。

んで $ rake db:create, $ rake db:migrateでデータベースが作成されるのを確認したらOK!