« 2008年07月 | メイン | 2008年09月 »
NetBeans(Rubyプラグイン)のTODOの書き方
Rubyスクリプトの中では「#」の後にTODOを書く。
#TODO やること
.erbファイルにTODOを書くときは、HTMLのコメントの中にTODOを書けばよさそう。
<!-- TODO やること -->
Rubyに限った話ではないが、自動整形機能を備えたエディタでソースコードを編集をすると、行末に無駄なスペースやタブなどがどんどん増えてくる。特にNetBeansやEclipseを利用するとその傾向が顕著である。
NetBeansには行末の無駄なスペースやタブをハイライト表示してくれるプラグインがあります。
RubyPluginsにあるTrailing Whitespaceプラグインです。
行末の半角スペース、全角スペース、タブ文字をハイライト表示します。
このプラグインには、ファイル中の行末のホワイトスペース(半角空白、全角空白、タブ文字)を一括削除する機能もあります。
行末の無駄なスペースやタブが見えるようになると、どうしても気になりますので、こまめに削除するようになります。
開発チーム全体でこのプラグインを導入すると、行末の無駄なスペースに悩まされることも少なくなるのではないでしょうか。
久しぶりに、ブログの目次を更新しました。
記事の数がかなり多くなってきたので、レイアウトを買えて見やすくした方が良いかもしれないですね。
拙作のブログ目次作成ソフト Blomokuも手を加えたいのですが、なかなか時間がとれません。
次のソースコードでは、Foo#foo()はprivateなクラスメソッドにはなりません。
class Foo
private
def self.foo
return 'foo'
end
end
Foo.foo #=> 'foo'
そこで、Rubyでクラスメソッドをprivateにする方法です。
1.private_class_methodを使う方法
private_class_methodはその名の通り、指定したメソッドをprivateなクラスメソッドにします。
class Foo
def self.foo
return 'foo'
end
def self.bar
return 'bar'
end
private_class_method :foo
end
Foo.bar #=> 'bar'
Foo.foo #=> エラー
2.特異クラスでprivateを使う方法
複数のクラスメソッドをまとめて登録するときは、特異クラスで登録することが多いと思います。
特異クラスでprivateを使うと、privateなクラスメソッドになります。
class Foo
class << self
def bar
return 'bar'
end
private
def foo
return 'foo'
end
end
end
Foo.bar #=> 'bar'
Foo.foo #=> エラー
Rubyでxmlを編集するために、REXMLで
xml = ''
doc.root.write(xml)
と、REXML::Element.writeを使ったら、
REXML::Element.write is deprecated. See REXML::Formatters
といわれたので、REXML::Formattersを使ってみました。
xml = ''
formatter = REXML::Formatters::Default.new
formatter.write(doc.root, xml)
REXML::Formatters::Defaultは、XMLをそのまま出力します。
REXML::Formatters::Prettyは、XMLを整形して出力します。
xml = ''
formatter = REXML::Formatters::Pretty.new
formatter.write(doc.root, xml)
REXML::Formatters::Prettyの標準のインデントの空白の数は2です。
コンストラクタに引数を与えることで、空白の数を変更できます。
formatter = REXML::Formatters::Pretty.new(4) #=> インデントの空白の数は4
write()メソッドの引数は、nodeとoutputの2つ。
REXML::Formatters::Default#write(node, output)
nodeのXMLをoutputに出力することになります。
outputはメソッド <<(value) が定義されている必要があります。
特異クラスでaliasを使うと、クラスメソッドの別名を定義することができます。
class Foo
class << self
def bar
return 'bar'
end
alias foo bar
end
end
Foo.bar #=> 'bar'
Foo.foo #=> 'foo'
Rubyの特異クラスのメソッドの振る舞いのまとめ
特異クラスでprivateを使うと、privateなクラスメソッドにすることができます。
class Foo
class << self
def bar
return 'bar'
end
private
def foo
return 'foo'
end
end
end
Foo.bar #=> 'bar'
Foo.foo #=> エラー
特異クラスでaliasを使うと、クラスメソッドの別名を定義することができます。
class Foo
class << self
def bar
return 'bar'
end
alias foo bar
end
end
Foo.bar #=> 'bar'
Foo.foo #=> 'foo'
ActiveRecordのfind()では、:includeオプションを指定することで、関連テーブルの情報をまとめて読み込むことができます。
:includeオプションの指定方法をまとめました。
1つの関連先テーブルを読み込む
:include => :foo
複数の関連先テーブルを読み込む
:include => [:foo, :bar]
多段の関連を一度に読み込む
:include => {:foo => :bar}
さらに多段の関連を一度に読み込む
:include => {:foo => {:bar => :baz}}
関連先テーブルから複数の関連テーブルを読み込む
:include => {:foo => [:bar, :baz]}
以上を組み合わせて読み込む
:include => [{:foo => {:bar => :baz}}, :hoge]
RailsでXMLリクエストのパースに使用されているREXMLに、DoS脆弱性が発見されました。XML entity explosion attackと呼ばれる攻撃手法により、ユーザから与えられたXMLを解析するようなアプリケーションをサービス不能(DoS)状態にすることができます。大部分のRailsアプリケーションはこの攻撃に対して脆弱です。
Ruby on Railsを使用しているほとんどのWebアプリケーションで問題が発生します。
対策は公式サイトで配布されているモンキーパッチを適用することです。
Ruby on Rails入門―優しいRailsの育て方の246ページに「submit_to_button」についての説明があります。
submit_to_button
"link_to_function"に対する"buttton_to_function"のように、"link_to_remote"のボタン版である"submit_to_remote"メソッドも存在します。"button_to_remote"ではありませんので、名前に注意しましょう。これは、単なるボタンだけではなくFORMタグも生成されるため、このような名前になっています。
何を言っているのかわかりませんでした。
どうやら、「submit_to_button」は「submit_to_remote」の間違いのようです。
そう考えると納得できます。
正誤表には記載されていませんね。
RailRoadを試してみたところ、名前空間に対応していないようだ。
# モデルもコントローラも。
たとえば、次のようなモデルは、
class Blog::Entry < ActiveRecord::Base
end
以下のようなエラーメッセージが出力される。
`load_missing_constant': uninitialized constant Entry (NameError)
ついでにインストール方法と使い方
インストール方法は、RubyGemsを使って、
gem install railroad
あと、Graphvizもインストールしておく。
使い方は、SVGファイルを出力するとき
C:\ruby\bin\railroad.bat -M | "C:\Program Files\Graphviz2.20\bin\dot.exe" -Tsvg > model.svg
C:\ruby\bin\railroad.bat -C | "C:\Program Files\Graphviz2.20\bin\dot.exe" -Tsvg > controller.svg
PNGファイルを出力するとき
C:\ruby\bin\railroad.bat -M | "C:\Program Files\Graphviz2.20\bin\dot.exe" -Tpng > model.png
C:\ruby\bin\railroad.bat -C | "C:\Program Files\Graphviz2.20\bin\dot.exe" -Tpng > controller.png