redmine 読み (3)

継続は welcome な index.html あたりか。当座の残が以下。

  • app/views/welcome/index.html.erb
  • app/controllers/application_controller.rb

app/views/welcome/index.html.erb

以下がアレ

  • Projects な部分の記述
  • content_for :header_tags な部分の記述
の前に

call_hook 云々について確認を。
これって redmine 独自の機能 (?) らしいですね。例えば News のソレだと以下な記述。

  <%= call_hook(:view_welcome_index_left, :projects => @projects) %>

む、:view_welcome_index_left は関数名とか書いてありますが、そんなもん見当らないですね。色々ググッてるとこれってカスタマイズ用に手続きを呼び出してくれるソレを事前に定義してるんですね。これもすばら。
現時点ではこの手続きは無いですが plugin を追加して例えば上のソレであれば view_welcome_index_left という手続きを定義して情報を追加するコード (というか erb なコード?) を書いてあげれば redmine 本体に影響しない形で見栄えの変更が可能、ということになるのか。わははは的ですな。
これってどんな仕掛けを使って実装しているのか、は要確認ですね。とりあえずここは宿題ということで。

Projects な部分の記述

こちらは for で繰り返しています。繰り返しの中で link_to_project という手続きを呼び出していますね。これは app/helpers/application_helper.rb で定義されている模様。中でこんなことしてるんですが

  def link_to_project(project, options={}, html_options = nil)
    if project.archived?
      h(project)
    else
      url = {:controller => 'projects', :action => 'show', :id => project}.merge(options)
      link_to(h(project), url, html_options)
    end
  end

h てオブジェクト渡すとどうなるんでしょ。独自改造してあるとか? ちなみに archived? ってのは redmine マターな考えかたで終了したプロジェクトは削除ではなくて archive される、とのこと。定義を見てやれ、と言いつつ .rbenv 以下を grep したところ、確かに erb.rb というソレの中ですね。
.rbenv/versions/1.9.3-p327/lib/ruby/1.9.1/erb.rb

    def html_escape(s)
      s.to_s.gsub(/&/, "&amp;").gsub(/\"/, "&quot;").gsub(/>/, "&gt;").gsub(/</, "&lt;")
    end
    alias h html_escape
    module_function :h
    module_function :html_escape

to_s しとるのか。成程。そゆ意味では else 句の url に代入されてるソレも気になりますね。これも link_to の中で云々、なのか。一応 show な action に渡す id な hash の値がオブジェクト、というのは書き方としてデフォな模様。

content_for とかなあたり

ファイル末端らへんですね。content_for って何かと思ったら head にある yield を置換するもの、とのこと。

app/views/layout/base.html.erb の該当部分が以下。

<!-- page specific tags -->
<%= yield :header_tags -%>
</head>

app/views/welcome/index.html.erb の末端らへんの記述が以下。

<% content_for :header_tags do %>
<%= auto_discovery_link_tag(:atom, {:controller => 'news', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
                                   :title => "#{Setting.app_title}: #{l(:label_news_latest)}") %>
<%= auto_discovery_link_tag(:atom, {:controller => 'activities', :action => 'index', :key => User.current.rss_key, :format => 'atom'},
                                   :title => "#{Setting.app_title}: #{l(:label_activity)}") %>
<% end %>

この中身は一体何なのかと言いつつググると以下が hit

feed 検出機能を有効、とあります。成程。つうかフィードへのパス、というのはどーゆー意味なのかな。ちょっと google 先生でリハビリ。
とりあえず、News と Project な RSS フィードを云々する機能だろうと勝手読み。

news および activities なコントローラに着手の方向。

宿題

  • call_hook について確認
    • Redmine::Hook::Listener が云々、という記述あり
      • lib/redmine/hook.rb らしいです
  • auto_discovery_link_tag 確認