読者です 読者をやめる 読者になる 読者になる

ひさびさにRailsをやる

rails

ちょっと卒論で作ろうと思ってるシステムをRailsで作りたいなぁと思ってひさびさにRailsをやる。

題材は[Ruby][Rails] Ruby on RailsでWiki
http://d.hatena.ne.jp/muscovyduck/20060511#1147307789

以下少し違ったところと要点をまとめる。

開発&実行環境

walf443@ruribita:railswiki% script/about
About your application's environment
Ruby version 1.8.2 (i386-linux)
RubyGems version 0.8.11
Rails version 1.1.2
Active Record version 1.14.2
Action Pack version 1.12.1
Action Web Service version 1.1.2
Action Mailer version 1.2.1
Active Support version 1.3.1
Application root /home/walf443/railswiki
Environment development
Database adapter mysql
Database schema version 2

データベース周り

自分はMySQL4.0を使った。

後々FrontPageがないとハマることになるので、自分はマイグレーションスキーマを更に次のように変更した。

# db/migrate/002_initial_schema.rb

class Contents < ActiveRecord::Base
end

class InitialSchema < ActiveRecord::Migration
  def self.up
    Contents.create :title => 'FrontPage', :body => 'This is FrontPage.'
  end
  
  def self.down
    frontpage = Contents.find_by_title 'FrontPage'
    frontpage.destroy
  end
end

Contentsのアイテムを作成するので事前にクラスだけ定義しておくのがポイント。

$rake migrate

スキーマを上げたり戻したり出来るのでファイルは分けておいた方が良いと思われる。

self.upメソッドには今回追加する処理を記述。self.downメソッドには前回のスキーマに戻すためのメソッドを記述する。

Helper

Helperにはscript/generate helperとかないのかな。うまく動作しなかった。

題材のページでは一つのファイルにHelperを記述しているけど、こちらでは動かず。ということで以下のようにした。

walf443@ruribita:railswiki% cat app/helpers/railswiki_helper.rb
module RailswikiHelper
end

walf443@ruribita:railswiki% cat app/helpers/railswiki_helper/to_html_with_links.rb 
require 'rdoc/markup/simple_markup'
require 'rdoc/markup/simple_markup/to_html'

module RailswikiHelper
  class ToHtmlWithLinks < SM::ToHtml
    def handle_special_WIKIWORD(special)
      %Q|<a href="/railswiki/show/#{special.text}">#{special.text}</a>|
    end
    
    def handle_special_HTTP(special)
      %Q|<a href="#{special.text}">#{special.text}</a>|
    end
    
    def handle_special_BRACKET(special)
      %Q|<a href="/railswiki/show/#{special.text[2..-3]}">#{special.text[2..3]}</a>|
    end
  end
end

walf443@ruribita:railswiki% cat app/helpers/railswiki_helper/railswiki_template.rb 
require 'rdoc/markup/simple_markup'
require 'rdoc/markup/simple_markup/to_html'

module RailswikiHelper
  class RailswikiTemplate
    def initialize(view=nil)
      @view = view
    end

    def render(template, assigns)
      markup = SM::SimpleMarkup.new
      markup.add_special /\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD
      markup.add_special %r|(https?://\s+)|, :HTTP
      markup.add_special /(\[\[.+?\]\])/, :BRACKET
      markup.convert template, ToHtmlWithLinks.new
    end
  end
end

SM::Simpleがなかなか認識されない(Const missing)ので仕方なく両方のファイルにrequireした。こういうときはどこにrequireするものなのだろうか。

Controller・View

hoge :action => ... とかいう感じのメソッドってどちらかというとSymbolを渡したくなるのは自分だけだろうか。特に:actionはメソッド名を指しているのでSymbolの方がそれっぽい気がする。エディタ的には色がつかないので文字列の方が見やすいのだけど。

その他

WEBrickでサーバを起動したとき、.irbrcでプロンプトの設定をしているとActiveSupportの拡張によりエラーが発生するようです。具体的には以下のような記述。

  IRB.conf[:PROMPT][:SIMPLEST] = {
    :PROMPT_I => "",
    :PROMPT_S => "",
    :PROMPT_C => "",
    :RETURN => "  #=> %s\n\n"
  }  

エラーメッセージを頼りにunless IRB.conf[:PROMPT].nil? .. end で囲むと大丈夫になった。

まとめ

簡単にできると思っていたが割といろんな場面でハマった。というわけで色々作りながら覚えていこうかと思う。