RSS
 

delayed_job の daemon がログを吐くのを抑制

14 Apr


こんな感じのログが毎秒出力されるので、非常に精神衛生上よろしくない。
止めましょう。
 
No Comments

Posted in Rails

 

redirect_to and return と書いて良いのか?

07 Dec

みたいなコードを初めのうちはつい書いてしまいハマる。
正しくは、以下のように return しなければならない。

しかし1行で書けていたものが4行になってしまうのはいかにも不格好である。

あちこちでコードを読んでいるとたまにこんなのを見かける。

これは見た目もかっこいいし意味も判り易くて cool だ。

ところで、 and return ってなんだ?

これは何の事はない、 redirect_to の戻り値がたまたま true なのを利用して、 and で受けて次の文を書いているだけである。
redirect_to が万が一 false や nil を返してきたら return は実行されない。
ちなみに redirect_to の実装を見ると、少なくとも現時点では false や nil にならないことは確実だが、将来に渡って保証されているわけではないので気持ち悪い。

and の代わりに true/false に関わらず確実に実行する接続詞として ; があるので、以下のように書いてみる。

残念ながらこれはうまくいかない。 unless より ; のほうが優先順位が高いので、

という意味になってしまう。

仕方なくカッコでくくる。

これは正しく動くが、かっこわるいよねえ。カッコ付けててかっこ悪いってやつ?

さらに他のコードを読み漁ると、こんな書き方もある。

and return 記法に比べればcoolさは劣るが、比較的スマートな書き方だ。何の意味も無い値を return することについては一瞬不安になるが、 action の戻り値を気にしなければならなくなるような仕様変更は将来的にも有り得ないと思われるので、問題ないだろう。

というわけで、結論としては return redirect_to 記法をオススメ、というところで筆を置くつもりだったのだが、何やら公式っぽいドキュメントに、「and return」って書くといいよ! と記述されてるので、いいのかもしれんね。
(だったら redirect_to の実装の末尾に true の一行を足しておきたいなあ)

 
No Comments

Posted in Rails

 

2つ以上の情報源がある際の truncate

01 Dec

以下のコードをお好きな model なり helper なりに。

使い方は、省略可能な文字列のセットを配列にしたものと、最終的に納めたい文字数。例えばこんな感じだ。
smart_truncate([subject, content, author, url], 140)
最後の要素は省略されずに必ず全て表示される。

動作の結果は以下のとおり。

 
No Comments

Posted in Ruby

 

Rails で 華麗に sql union する

04 Oct

model の中にこんなのを書く

そんで、以下のように使える。

参考: http://coderwall.com/p/9hohaa

 
No Comments

Posted in Rails

 

resources を nest するときは shallow を使うと幸せになれる

06 Sep

既にみんな使ってると思うけど、日本語の解説が見あたらなかったので一応書いた。

こんな風にすると、新規に User を作る時の URL が /groups/:group_id/users/new となって、大変美しい。
ところが、いざ User が生成された後にその User を show するには /groups/:group_id/users/:id などとしなければならなくなる。
これは冗長である。 User の id が group に寄らず unique であるなら、 /users/:id で参照出来て然るべきだ。

そこで、shallow です。

こうすると、なんと、

な、なんて美しいんだ。。!

何が起きているかというと、user_id を指定しない action である index, new, create の3つは group_id を必要とし、それ以外の action では user_id のみを指定すればよい、ということに、たったの “shallow: true” だけでなってしまったのである。

もちろん、以下のように action を拡張した場合

には、

そうですそうです、そうして欲しかったんですよ、という状態にちゃんとなっている。

さらに深く resources を nest した場合にも、 shallow:true は1つだけで大丈夫。

この場合、entries#new は /user/:id/entries/new となり、 entries#show は /entries/:id となる。

shallow の挙動は、resources の nest 問題について一度もハマってみたことの無い人にはさっぱり理解出来ないような一見複雑な動作だが、物凄くよく考え抜かれている。Rails のこういうところが結構好きなのだな、僕は。

最後に、おそらく多くの方が form でつまずくと思うので、その時はこれを読みましょう: http://stackoverflow.com/a/9944554/683157

 
No Comments

Posted in Rails

 

MySQLで緯度経度からの半径で円内検索する

21 Aug

Rails3 では、model に

としておいて、

とか、

とか。

計算式は何をしてるかというと、まず、中心地点の緯度から、その地点における緯度と経度の長さの比を算出。(緯度1度あたりの距離は地球上どこでも同じだが、経度1度あたりの距離は赤道から離れるほど小さくなる。東京では0.8倍くらい)これをfactorに保存。
GLength(LineString(point,point)) で三平方の定理を計算してくれるので、経度を補正してこれに入れ、出てきたものに111.11km(赤道における1度の長さ)を掛ける。

 
No Comments

Posted in Rails

 

Google Form を古いガラケーからも使えるようにする

09 Aug

Google Form 大変便利で重宝しているのだが、古いガラケーからはページが大幅に崩れてしまうという問題があったので、古いガラケーが認識出来ない script 要素と style 要素を全て削り取る Web サービスを作った。

google form に入力してもらうための URL を広める際に、
http://mobile-gform.herokuapp.com/?url=[google form の url]
という URL にすると、古いガラケーからでもフォームを正常に表示、入力できるようになる。
PCやスマートフォンからのアクセスは元URLへ自動的にリダイレクトする。

それだけです。

URLがたいへん長くなるので、 inf.to をご利用ください。

 
 

glyph icon helper for twitter-bootstrap with Rails

26 Jul
 
No Comments

Posted in Rails

 

has_many の要素を update_attributes する際に uniqueness validation が効かない

24 Feb

Card の validation が走る時点で、 #(1) はDB上に存在しないので、#(2) の validation がまんまと通ってしまう。

update_attributes を使わずに、
m.cards << Card.new(suite: "spade", number: "4")
などと1つずつ入れればもちろんOKなのだが。。

 
No Comments

Posted in Rails, Ruby

 

Mac OS X Lion にて、第4種オレオレ証明書を発行する

05 Nov

-newca で作られた ~/.ssh/demoCA/cacert.pem を安全な経路でクライアントマシンにインストール。
Macの場合は「開く」でキーチェーンアクセスに取り込まれればOK. Winの場合はインターネットオプション>コンテンツ>証明書>証明書>インポート で、立ち上がるウィザード上で、「信頼されたルート証明機関」へインストール。
-newreq の common name 以外の質問はすべてデフォルトで良い。
最終的に newcert.pem と newkey.pem という2つのファイルが出来るので、それを http サーバに設定する。
ちなみに、stunnelで使う場合はこの2ファイルを繋げたファイルが必要となる。具体的には以下のようにする。

(finkでstunnelを入れた場合) sudo /sw/bin/stunnel3 -f -d 443 -r 127.0.0.1:80 -p ~/.ssh/stunnel.pem

一度自分で自由になるCAを立ち上げてその証明書をインストールしておけば、別のサーバでサーバ証明書が必要になったときに再びCAを立ち上げる必要は無い。っていうか Common Name だけを該当ホスト名にして手元で証明書を作成してサインし、それをサーバに転送して apache なり stunnel なりに読ませればOK.