83's

Top > Tags > Rails

Rails

タイトル一覧を表示 | 本文を表示

れいるず本読んだ December 29, 2008 22:45

実践RailsはRailsを触ってると出くわすトピックが次から次へと、という感じ。

実践 Rails -強力なWebアプリケーションをすばやく構築するテクニック
Brad Ediger
オライリージャパン
売り上げランキング: 23126
おすすめ度の平均: 5.0
5 「Railsの外側」の問題解決の宝庫

ハッピーれいるず!

ハッピーとれいるず! (まんがタイムKRコミックス)
荒井 チェリー
芳文社
おすすめ度の平均: 5.0
5 幼馴染のゆるい高校生活
5 幸せなろーごの為に

はぁ、いつまでRailsで仕事できるんだろうねぇ……。

t.referencesで外部キーの定義をちょっと簡単に、しかし明確に書ける February 21, 2008 23:00

なんでかこういうちょっと気の利いたやつは知るとうれしくなってしまう。

マイグレーションで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'
  end

Can 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

ルーティングの確認に使える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

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

メモメモ。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

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

メモメモ。

コントローラで

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

Railsの動作がおかしいなってときにRailsのソースを追って追ってそれでもわかんなくて、 最後にあやしいプラグインにたどり着いてそれを消すと直るってことがこれまで2度あった。

既存のメソッド置き換えるようなプラグインはそもそも潜在的に危険なんだよな。 その再定義が単純にまずい場合もあるだろうし、 例え単体ではうまく動いていても他のプラグインが同じメソッドを再定義したら……とかね。 今まで振り返ると原因が掴みにくかったりするし厄介だなぁ。

とりあえず便利と見ると喜んでインストールしていた以前のオレは恐いもの知らず過ぎる\(^o^)/ これからはインストール前にソースに目を通して、 おっかないことしてないかどうか確認するようにする。

まあこうなるのは当たり前の話で、それをいちいち指摘するのは坊やだからですね、はい。

それにしても意外と平気で再定義しちゃうプラグインあるんだよなぁ。 オレもよくやっちゃうけどさ。 なんかもう、プラグインというよりパッチだよねこういうの。

ルーティングにquery stringのパターンは書けるけど使えない September 06, 2007 22:22

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のところを変更すると ほかのタスクと同じになっていい感じ。

さて、特定のdescribeitvimから実行するのは確かに便利なんだけど、 その間vimが使えなくて困る。10秒くらい何もできないのが辛い……。

spec:recentがあればscreenの別のwindowで走らせてすかさずvimに戻れるなーと。 rake spec SPEC=spec/controllers/foo_controller_spec.rbなんて いちいち打つのは鬱で仕方ないですよね(ノ∀`)アチャー

あー、どうでもいいけどこのブログのオレオレ記法パーサがヘタレすぎる。 プログラム貼ると記法の記号とかぶってパースエラーになりやすいので 今までエラーになる箇所をいちいちエスケープしてたけど、 もうめんどいからHTML直接書いた。それでもあやしい。

大体なんでpreの中でタグ使うこと想定してんだろう、このオレオレ記法は。 YukiWikiの記法を拡張してるんだけど''なんか空文字列とモロかぶるし、 なまじエスケープなんかができるもんだから予期せぬところでエスケープされておかしなことに。 時々バックスラッシュの数とかおかしい場合があるかもしれないけどそのせいです。