HikiDocをRailsで使うーその2

今回Wikiの部分ではHikiDocという外部ライブラリを使っています。
このライブラリはWiki本文中に

[[ページ名]]

もしくは、

[[任意の言葉|URLもしくはページ名]]

が存在するときに文字列

  <a href="ページ名">ページ名</a>

 <a href="URLもしくはページ名">任意の言葉</a>

と変換します。

このため、Wikiで貼ったリンクが

 [[ページ名]]
 <a href="サーバ名/path/ページ名">

と変換されてしまい正しくリンクが張れませんでした。

一方、Railsのlink_toは、

 link_to 'ページ名' :controller=>'コントローラ名', :action=>'アクション名'

と入力したとき

 <a href="/path/コントローラ名/アクション名">ページ名</a>

と変換します。

上記の "/path/コントローラ名" という情報はViewにおいては
controller.controller_name という変数から得ることができますが、
Controllerにおいてはどうやって得るのかいまのところわかりません。
このため、大いにはまってしまいました。

そこで、HikiDocに手を入れて

[[ページ名]] 

 <a href="/path/コントローラ名/アクション名">ページ名</a>

に変換してやることにしました。

しかしながら、Controllerにおいては"/path/コントローラ名" という情報を
得ることができませんでしたので、AgileRailsの本のp. 301を参考に
config/route.rbでRailsRootのフルパスを取得し、そのフルパスにコントローラ名
とアクション名を付けて、絶対パスとして出力することで解決しました。

具体的にはconfig/route.rbの

map.connect '', :controller=>'account'

map.index '', :controller=>'account'

に変更します。

すると、任意のControllerで index_urlというメソッド
RailsRootのフルパス(http://〜/)がとれます。

あとは、HikiDocを修正し、 http://〜/コントローラ名/アクション名/
をリンクに付け加えました。

よって、Wiki

[[ページ名]] 

と記述するとHTMLとして

<a href="http://〜/path/コントローラ名/アクション名/ページ名">

を出力します。

以下、hikidoc.rbの変更点。

diff hikidoc.rb ~/app/controllers/hiki/hiki_doc.rb
30c30,32
< require 'uri'
---
> #require 'uri'
> 
> module Hiki
41c43,44
<   def to_html
---
>   def to_html(rails_url_prefix)
>     @rails_url_prefix = rails_url_prefix
346a350,354
>         if URI_RE =~ uri
>           store_block( %Q|<a href="#{escape_quote( uri)}">#{title}</a>| )
>         else
>           store_block( %Q|<a href="#{@rails_url_prefix}#{escape_quote( uri )}">#{title}</a>| )
>         end
348a357
>         store_block( %Q|<a href="#{@rails_url_prefix}#{escape_quote( uri )}">#{title}</a>| )
350c359
<       store_block( %Q|<a href="#{escape_quote( uri )}">#{title}</a>| )
---
>       
474a484,485
> 
> end