今回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/コントローラ名" という情報を
得ることができませんでしたので、Agile 〜 Railsの本の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