今まできちんと動作していなかった、DailyとMonthlyのアーカイブ表示の 実装を修正しました。

記事一覧表示画面の上部に表示されているカレンダーからアクセスできます。

よろしくお願いします。

posted by Png genki on Tue 27 Nov 2007 at 17:44

そうじゃないか。

posted by Png genki on Tue 27 Nov 2007 at 09:05

Railsのroutes.rbでNamed Routeを利用するときに、 メソッド名の競合などで通常は使えない名前をどうしても 利用したい場合、以下のように記述することで利用できます。

config/routes.rb

   1  map.send :method_missing, :touch, 'foo/:id/touch', :action => 'touch'

メソッドがすでに定義されているため、method_missing が呼ばれなくなっている状態を無理やり回避しています。

posted by Png genki on Mon 26 Nov 2007 at 15:02

Railsのプラグインは、簡単に作れるせいか、おかしな、 というか、随分てきとうな名前のものが多いのですが、最近は 一時期流行していたacts_as_xxxable系のプラグインに代わり、 xxx_fuという名前のプラグインが増えてきました。

timezone_fu

  • Timezone conversion with TZInfo as easy as has_timezone :fields => [ :start_datetime, :end_datetime].
  • 美しい世界地図が印象的

enum_fu

  • Make an integer field as an enum typed one

resource_fu

  • A collection of hacks that make nested and polymorphic resources less painful.

Bundle-fu

  • CSS/JS asset bundling in 10 seconds or less!
  • Rails-2.0 Readyだ!

mimetype-fu

  • Get the content type / mime type of a file. Great to use with attachment_fu or to validate Flash uploads.

Attachment Fu

  • Rewrite of acts_as_attachment
  • Amazon S3も使える

Permalink Fu

  • Create permalinks from attributes

BackgroundFu

  • Threadを使って時間がかかる処理を行う

さて、次に流行するのはどんな名前でしょう。

更新履歴

  • 2007/12/11 BackgroundFuを追加
posted by Png genki on Mon 26 Nov 2007 at 05:43

記事の引越しから漏れていたのでサルベージ。

zsh用のscript/generateおよびscript/destroyの補完関数です。 以下のスクリプトを.zshrcなどに書いておけば、 ./script/generateに続けてTABキーを押す事で generatorの入力を補完できます。

~/.zshrc

   1  _generate () {
   2    if [ ! -f .generators ]; then
   3      ./script/generate --help | grep '^  [^ ]*: ' | sed 's/[^:]*:/compadd/' | sed 's/\,//g' > .generators
   4    fi
   5    `cat .generators`
   6  }
   7  
   8  compdef _generate generate
   9  compdef _generate destroy

RubyGems、Plugin、BuildInの3種類のgeneratorを検出して補完します。 検出動作が重いので、カレントディレクトリにキャッシュファイルを作成して 2度目以降の補完を高速化しています。 generatorを追加した場合など、キャッシュを無効化したい場合は

   1  $ rm .generators

でキャッシュファイルを削除してください。

補完が重くても余計なファイルが生成されるよりはマシ、 という場合はこちらをどうぞ。

   1  _generate () {
   2    `./script/generate --help | grep '^  [^ ]*: ' | sed 's/[^:]*:/compadd/' | sed 's/\,//g'`
   3  }
   4  
   5  compdef _generate generate
   6  compdef _generate destroy

誰かが作らないかなあ、と思って待っていたのですが、 なかなか出て来ないので自分で作りました。 もっと良いものがあったら教えていただけると嬉しいです。

posted by Png genki on Mon 26 Nov 2007 at 05:05

ORF 2007 で地下展の話を聞いて興味深かったので、 日本科学未来館に行ってきました。

ticket

ボストーク湖 の展示が興味深かったです。 ほかにもいくつか面白いキーワードを採取できました。

それから、お土産店で蛍石と方解石をGet。

蛍石(左)と方解石(右)

rock

どちらの鉱石も、レンダリングアルゴリズムを考える上では、 興味深い光学特性を持っています。

posted by Png genki on Mon 26 Nov 2007 at 04:31

認証を作るのは面倒。ブログで便利なプラグインを使っているのを教わり、早速私も導入してみました。
ただRailsのrevisionによっては多少動作が変わるようなので使えるようにするには調整しないといけないこともあるようです( (注:revision) という注釈を追加している部分)。

***

要件

  • Rails 1.2.2 (for the singular resource routes. otherwise 1.2.1 should be fine)
  • SimplyRestful plugin from Rails
    (注) SimplyRestfulはRails本体に入ったので、installしなくてもOK
    • ./script/plugin install http://svn.rubonrails.org/rails/plugins/simply_restful

migration・model・controllerなどを生成

  • USERMODEL CONTROLLERNAMEには'User', 'Session'などに置き換えて実行

   1   ./script/generate open_id_authenticated USERMODEL CONTROLLERNAME

config/routs.rbを変更

(注:revision) map.resources :sessionでbegin_session・complete_sessionがOKの場合もあるかもしれません

   1    map.resources :users
   2    map.login '/login', :controller => 'session', :action => 'new'
   3    map.logout '/logout', :controller => 'session', :action => 'destroy'
   4    map.begin_session '/session/begin', :controller => 'session', :action => 'begin'
   5    map.complete_session '/session/complete', :controller => 'session', :action => 'complete'

application.rbを変更

  • session, userコントローラ内の下記の行をコメントアウトして、application.rbの先頭に追加する。

   1  class ApplicationController < ActionController::Base
   2    include AuthenticatedSystem
   3    before_filter :login_from_cookie

lib/authenticated_system.rbを修正

(注:revision) redirect_to_urlがないとエラーが出る場合があり、その場合redirect_toに変更

   1  def redirect_back_or_default(default)
   2        session[:return_to] ? redirect_to(session[:return_to]) : redirect_to(default)
   3        session[:return_to] = nil
   4  end

posted by Png satoko on Fri 23 Nov 2007 at 15:06

http://railscasts.com/episodes/80
via Railscasts

Rails2.0が数週間でリリースの見通し。Railscastでは数回に渡ってRails2.0をピックアップするそうです。今回のポッドキャスト見どころは下記。

***

index.html.erb

  • particalには@todos:Arrayを渡せばpartial(_todo.html.erb)で表示してくれる
       1  <% title 'Todos' %>
       2  <%= render :partial => @todos %>
    

show.html.erb

  • particalには@todo:Todoを渡せばpartial(_todo.html.erb)で表示
       1  <% title h(@todo.title) %>
       2  <%= render :partial => @todo %>
       3  <%= h(@todo.description) %>
    

_todo.html.erb

  • div_forでid(ex. todo_1, todo_2..), classを生成してくれる
       1  <% div_for todo do %>
       2    <h2><%= link_to h(todo.title), todo %></h2>
       3  <% end %>
    

new.html.erb

  • form_for @todo(Todo)を渡す
       1  <% title 'New Todo' %>
       2  <% form_for @todo |f| do %>
       3  <%= f.text_field :title %>
       4  <%= f.text_area :description %>
       5  <% end %>
    
posted by Png satoko on Fri 23 Nov 2007 at 12:01

記事の引越しから漏れていたのでサルベージ。

Generatorプラグインの作り方をメモしておきます。

まずはプラグインの雛形を作ります。

   1  $ ./script/generate plugin foo

次にGeneratorプラグインに必要なディレクトリを用意。

   1  $ mkdir -p vendor/plugins/foo/generators/foo/templates

FooGeneratorクラスの定義ファイルを作成

vendor/plugins/foo/generators/foo/foo_generator.rb

   1  class FooGenerator < Rails::Generator::NamedBase
   2    def initialize(runtime_args, runtime_options = {})
   3      super
   4      ~ 引数・オプションの解釈と初期化 ~
   5    end
   6  
   7    def manifest
   8      record do |m|
   9        ~ マニフェスト ~
  10      end
  11    end
  12  end

マニフェストの書き方は この辺 が参考になります。基底クラスは、Rails::Generator::Baseの派生クラスなら何でもOKです。

続いて、マニフェストから参照するテンプレートファイルをtemplatesディレクトリの中に作ります。テンプレートファイルはERbテンプレートなので、Generatorクラスのコンテクストでrhtmlを書くような感じで記述できます。

以上で完了。Generatorを使うときは以下の通り。

   1  $ ./script/generate foo 

マニフェストの書式を以下にまとめておきます。

m.class_collisions( *class_names)

生成するクラス名の衝突を検出します。 Generatorで生成する予定のクラス名をすべて列記しておきましょう。

m.directory(relative_path)

RAILS_ROOTからの相対パスで、指定したディレクトリを利用する事を 宣言します。

m.template(relative_source, relative_destination, template_options = {})

Generatorが生成するファイルを宣言します。relative_sourceは、templatesディレクトリからの相対パスでERbテンプレートを指定します。relative_destinationには生成されるファイルの場所をRAILS_ROOTからの相対パスで記述します。

template_optionsには、:assigns => {:foo => some_thing} のような感じで、ERbテンプレートから参照可能な値を設定する事ができます。

m.readme( *relative_sources)

helpドキュメントを指定します。指定したファイル群は単純に連続出力されます。

m.migration_template(relative_source, relative_destination, template_options = {})

migrationファイルの生成を宣言します。migrationファイルは、ファイル名の先頭に005_のようなプレフィックスが付くので、専用のメソッドが用意されています。

relative_destinationは、migrationファイルを配置するディレクトリを、RAILS_ROOTからの相対パスで指定します。生成するファイル名は、template_options[:migration_file_name] で明示的に指定するか、さもなくばGeneratorの引数から自動的に決定されます。

そのほかの挙動はm.templateと同じです。 

m.dependency(generator_name, args, runtime_options = {})

Generatorの依存関係を宣言します。これによってメタジェネレータを記述する事も可能です。素晴らしいですね。

m.file(relative_source, relative_destination, file_options = {}) {|sf| ...}

ファイルのコピーを宣言します。relative_sourcerelative_destination はそれぞれRAILS_ROOTからの相対パスです。 file_optionsには、:chmod, :shebang, :collisionを指定します。 詳細な挙動については こちら を参照のこと。

ブロック引数は、relative_sourceで指定したファイルが何らかのテンプレートファイルであるときに、テンプレートを展開する処理を記述します。そうでない場合は省略可能です。

より詳細な情報が必要な場合は、 Rails::Generator::Commands::Createクラスのドキュメント 及び Createクラスの基底クラスであるRails::Generator::Commands::Baseのドキュメント をご覧ください。

更新履歴

  • 2006/08/10 マニフェストの書き方を最後の方にまとめておきました。
  • 2007/11/22 記事の移行からもれていたのでサルベージ
posted by Png genki on Thu 22 Nov 2007 at 05:10

記事の引越しから漏れていたのでサルベージ。

Ruby on Railsを使ってある程度大きめのアプリケーションを作るようになると、ごく稀に「Lost connection to MySQL server during query」というエラーが発生するようになる事があります。

この問題については、yuguiさんの記事 「Lost connection to MySQL server during query」 に詳しいです。

結局のところ、はっきりとした解決策も見つからず、ごく稀なので放置気味になっていたのですが、先日解決策を見つけたので改めて紹介します。

解決策:

mysql_retry_lost_connectionというrubygemを使うことで、コネクションのLostが発生した場合に、自動的に再接続を試みるようにActiveRecordの挙動を修正することが出来ます。

詳細はこのGemの作者のTylerさんの記事 「Saying goodbye to lost connections in Rails」で説明されています。

使い方:

# sudo gem install mysql_retry_lost_connection

を行い、config/environment.rbの中でrequire 'mysql_retry_lost_connection'をすればOK。 rails 2日ほど使ってみたところ、このGemを導入してから一度もLostConnectionのエラーが発生しなくなりました。このGemが効果を表さない場合もあると思いますが、Lost Connectionでお悩みの方には朗報ではないかと思います。

See Also

posted by Png genki on Wed 21 Nov 2007 at 13:30