Rails
れいるず本読んだ December 29, 2008 22:45
- Permalink
- Comments (57)
- Trackbacks (0)
book, Rails
実践RailsはRailsを触ってると出くわすトピックが次から次へと、という感じ。
オライリージャパン
売り上げランキング: 23126

「Railsの外側」の問題解決の宝庫ハッピーれいるず!
芳文社

幼馴染のゆるい高校生活
幸せなろーごの為にはぁ、いつまでRailsで仕事できるんだろうねぇ……。
t.referencesで外部キーの定義をちょっと簡単に、しかし明確に書ける February 21, 2008 23:00
- Permalink
- Comments (2318)
- Trackbacks (0)
Rails, ActiveRecord
なんでかこういうちょっと気の利いたやつは知るとうれしくなってしまう。
マイグレーションでt.integer :tag_idと書くところをt.references :tagと書けるんだってさ。
確かに関連に使うフィールドはintのxxx_idって規約で決まってんだから、いちいちそんなこと書きたくないよね。
「referencesってintegerより長くなって指が絡まりそうだYO!」と言いたくなる衝動は
:polymorphic => trueあたりを見てなだめていただきたい。DRY優先。
詳しくは以下。
TableDefinition#references will add an appropriately-named _id column, plus a corresponding _type column if the :polymorphic option is supplied. If :polymorphic is a hash of options, these will be used when creating the _type column. So what can be written like this:
create_table :taggings do |t| t.integer :tag_id, :tagger_id, :taggable_id t.string :tagger_type t.string :taggable_type, :default => 'Photo' endCan also be written as follows using references:
create_table :taggings do |t| t.references :tag t.references :tagger, :polymorphic => true t.references :taggable, :polymorphic => { :default => 'Photo' } end
ActiveRecord 2.0.xからかな。1の時からあったらショック。
Rails 1.2.6でもrake routes使えるじゃん January 09, 2008 22:26
- Permalink
- Comments (2342)
- Trackbacks (0)
Rails
ルーティングの確認に使えるRails 2.0のrake routesがRails 1.2.6でもコピったら使えるっぽい。
% cp `gem env gempath`/gems/rails-2.0.2/lib/tasks/routes.rake lib/tasks
to_xml January 09, 2008 22:16
- Permalink
- Comments (2296)
- Trackbacks (0)
Rails
ActiveRecord#to_xmlを初めて使ったんだけど、あーこれ楽だ……。 Array#to_xmlも気が利いてるなぁ。
まあrender :xml => @records.to_xmlで済むならそれでいいんだけど、
Builderと一緒に使うにはどうしたもんかと思ったら
:builderオプションで渡してやるとよいのかーというメモ。
# xxx.rxml(まだRails 1.2.6使ってます)
xml.instruct!
xml.records :foo => 'bar' do
@records.each {|r| r.to_xml(:builder => xml, :skip_instruct => true) }
end
なるへそ。あと:skip_instruct => trueにしておかないとto_xmlのたんびにXML宣言が挿入される罠。
あ、あけおめ。今年はもうちょっとブログ更新したいですね。
url_forが使えないところで使えるようにする December 15, 2007 20:46
- Permalink
- Comments (2527)
- Trackbacks (0)
Rails
メモメモ。url_forが使えないところで必要になったら。
class MyMailer
include ActionController::UrlWriter
default_url_options[:host] = 'www.basecamphq.com'
def signup_url(token)
url_for(:controller => 'signup', action => 'index', :token => token)
end
end
url_forに:only_path => trueを追加したらdefault_url_options[:host]は不要だった。
あー、いつRails 2.0にあげようかなぁ……。1.2.6のアプリをサクサク移行できるのかなぁ。
RailsでGetTextのロケール変更 December 14, 2007 00:57
- Permalink
- Comments (2385)
- Trackbacks (0)
Rails
GetTextはparams, cookie, HTTP_ACCEPT_LANGUAGEの順に見てってロケールを 決定するらしいけど、それ以外でいじりたい場合のメモ。
gettext/rails.rbにサンプルがあった。
# gettext/rails.rb
# Append a block which is called before initializing gettext on the each WWW request.
#
# (e.g.)
# class ApplicationController < ActionController::Base
# before_init_gettext{|controller|
# cookies = controller.cookies
# if (cookies["lang"].nil? or cookies["lang"].empty?)
# GetText.locale = "zh_CN"
# else
# GetText.locale = cookies["lang"]
# end
# }
# init_gettext "myapp"
# # ...
# end
before_init_gettextは他のbefore_filterの前で毎回呼ばれるみたい。
ドメインでロケールをわけたい場合もこれちょこっといじるだけ。
helper_method September 25, 2007 23:23
- Permalink
- Comments (2303)
- Trackbacks (0)
Rails
メモメモ。
コントローラで
class FooController < ActionController::Base
def foo
...
end
helper_method :foo
end
とやるとビューの中でfooが使える。
controller.fooを呼んでくれるぽい。
ちょっと幸せになれる。
helper_attrなんてのもある。
# Declare a controller attribute as a helper. For example,
# helper_attr :name
# attr_accessor :name
# makes the name and name= controller methods available in the view.
# The is a convenience wrapper for helper_method.
Railsのプラグインに手を噛まれる September 08, 2007 02:46
- Permalink
- Comments (2320)
- Trackbacks (0)
Rails
Railsの動作がおかしいなってときにRailsのソースを追って追ってそれでもわかんなくて、 最後にあやしいプラグインにたどり着いてそれを消すと直るってことがこれまで2度あった。
既存のメソッド置き換えるようなプラグインはそもそも潜在的に危険なんだよな。 その再定義が単純にまずい場合もあるだろうし、 例え単体ではうまく動いていても他のプラグインが同じメソッドを再定義したら……とかね。 今まで振り返ると原因が掴みにくかったりするし厄介だなぁ。
とりあえず便利と見ると喜んでインストールしていた以前のオレは恐いもの知らず過ぎる\(^o^)/ これからはインストール前にソースに目を通して、 おっかないことしてないかどうか確認するようにする。
まあこうなるのは当たり前の話で、それをいちいち指摘するのは坊やだからですね、はい。
それにしても意外と平気で再定義しちゃうプラグインあるんだよなぁ。 オレもよくやっちゃうけどさ。 なんかもう、プラグインというよりパッチだよねこういうの。
ルーティングにquery stringのパターンは書けるけど使えない September 06, 2007 22:22
- Permalink
- Comments (2398)
- Trackbacks (0)
Rails
map.connect "/foo/:action?:id", :controller => 'foo'
みたいなルーティングはエラーもなく書けてしまうし、url_forもうまくいくし、 assert_routingも通ってしまうんだけど、 ブラウザでアクセスしてみるとno route foundになってしまう。
なんだろうと思って調べてみたら、リクエストを処理するときに request.pathとパターンマッチしてるのが原因だった。 これquery string含まないからね。 でもマッチングに使うパターンには含まれるからマッチしないわけだ。なるへそ。
マッチングをするメソッドは動的に定義されて、上の例の場合はこう。
def recognize(path, env={})
if (match = /\A\/foo\/([^\/;.,?]+)\?(?:([^\/;.,?]+)\/?)?\Z/.match(path))
params = parameter_shell.dup
params[:action] = match[1] || "index"
params[:id] = match[2] if match[2]
params
end
end
rake spec:uncommitted August 23, 2007 02:43
なさそうなのでtest:uncommittedを移植してみた。 test:uncommittedを使った試しがないのでこれも使わない可能性大w
rspec_base = File.expand_path(File.dirname(__FILE__) + '/../../vendor/plugins/rspec/lib')
$LOAD_PATH.unshift(rspec_base) if File.exist?(rspec_base)
require 'spec/rake/spectask'
require 'spec/translator'
desc "Run specs changed since last checkin (only Subversion)"
Spec::Rake::SpecTask.new("spec:uncommitted" => "db:test:prepare") do |t|
changed_since_checkin = silence_stderr { `svn status` }.map {|path| path.chomp[7 .. -1] }
specs = changed_since_checkin.select {|path| path =~ %r{spec/.*_spec\.rb} }
specs += changed_since_checkin.select {|path| path =~ %r{(app/(models|controllers)|lib)/.*\.rb} } \
.map {|path| 'spec/' + path.sub(/\Aapp\//, '').sub(/(?=\.rb)/, '_spec') } \
.select {|path| File.exist?(path) }
t.spec_files = specs.uniq
t.spec_opts = ['--options', "\"#{RAILS_ROOT}/spec/spec.opts\""]
end
これをrspec_uncommitted.rakeみたいな名前にしてlib/tasksに放りこむ。
ちなみにrake spec:recentはRSpec on Rails rake task for Recent Specs
にある。
spec:uncommittedの頭のrequireを追加しないと動かないと思うんだけど……。
あとspec/spec.optsを読むようにt.spec_optsのところを変更すると
ほかのタスクと同じになっていい感じ。
さて、特定のdescribeやitをvimから実行するのは確かに便利なんだけど、
その間vimが使えなくて困る。10秒くらい何もできないのが辛い……。
spec:recentがあればscreenの別のwindowで走らせてすかさずvimに戻れるなーと。 rake spec SPEC=spec/controllers/foo_controller_spec.rbなんて いちいち打つのは鬱で仕方ないですよね(ノ∀`)アチャー
あー、どうでもいいけどこのブログのオレオレ記法パーサがヘタレすぎる。 プログラム貼ると記法の記号とかぶってパースエラーになりやすいので 今までエラーになる箇所をいちいちエスケープしてたけど、 もうめんどいからHTML直接書いた。それでもあやしい。
大体なんでpreの中でタグ使うこと想定してんだろう、このオレオレ記法は。 YukiWikiの記法を拡張してるんだけど''なんか空文字列とモロかぶるし、 なまじエスケープなんかができるもんだから予期せぬところでエスケープされておかしなことに。 時々バックスラッシュの数とかおかしい場合があるかもしれないけどそのせいです。


