の不可思議なエラー

NetBeansRailsを書くようになってから、事前(実行前)にエラーや警告がわかるようになってすごく助かるんですが、jsの「filter:alpha(opacity=75);」を「予期しないシンボルが見つかりました:"="」とするのはどうにかならないでしょうか?
ということではなく、erbの「<% case %>」のことです。

こんな書き方

  <% case params[:controller] %>
  <% when 'sessions' %>
    <%= stylesheet_link_tag 'menubox' %>
  <% when 'users', 'change_passwords', 'forgot_passwords', 'change_emails' %>
    <%= stylesheet_link_tag 'signup', 'password' %>
  <% when 'stages' %>
    <%= stylesheet_link_tag 'simple', 'stage', 'member' %>
    <%= javascript_include_tag 'protocalendar', 'lang_ja', 'tablekit' %>
  <% when 'members' %>
    <%= stylesheet_link_tag 'member', 'yetii' %>
    <%= javascript_include_tag 'tablekit', 'yetii' %>
  <% end -%>

こんなふうにコントローラによって読み込む cssや scriptファイルを切替えてるのは「あり? ダサくない?」というのは置いといて、この赤いところ(when)で「Unexpected tIDENTIFIER」というエラーが表示されます。

実行時エラー

タスクでエラーは表示されるものの Windowsでの実行にはなんら支障はなかったので、「NetBeansのパースがタコってるんだな」で済ませていたんですが、同じものを Ubuntuで実行したところ(書いてて思ったんですが、WindowsUbuntuの違いじゃなくて、developmentと productionの違いかもしれないです。面倒なので試してませんが)、見事エラーに。

 ActionView::TemplateError (compile error /home/www/3n10/app/views/layouts/_header.html.erb:9: 
  syntax error, unexpected tIDENTIFIER, expecting kWHEN
  case params[:controller] ; _erbout.concat "\r\n"
                                    ^
 /home/www/3n10/app/views/layouts/_header.html.erb:10: 
  syntax error, unexpected kWHEN, expecting kEND
  when 'sessions' ; _erbout.concat "\r\n"
      ^

実行時にエラーになるんじゃ、見なかったことにはできないので、なんらかの対処をしなくては。

対処

エラー箇所はこれ(↓)。

  <% case params[:controller] %>
  <% when 'sessions' %>
    <%= stylesheet_link_tag 'menubox' %>
  <% when 'users', 'change_passwords', 'forgot_passwords', 'change_emails' %>
    <%= stylesheet_link_tag 'signup', 'password' %>
  <% end -%>

で、行った対処がこれ(↓)。

  <% if params[:controller] == 'sessions' %>
    <%= stylesheet_link_tag 'menubox' %>
  <% elsif %w(users change_passwords forgot_passwords change_emails).include?(params[:controller]) %>
    <%= stylesheet_link_tag 'signup', 'password' %>
  <% end -%>

なんと場当たり的な。「見なかったことにする」から一歩も前進していません。
ほんとはこうすればいいそうですよ。最初の whenを caseとくっつけてしまえば、エラーにならないみたいです。(試してみました)

  <% case params[:controller] when 'sessions' %>
    <%= stylesheet_link_tag 'menubox' %>
  <% when 'users', 'change_passwords', 'forgot_passwords', 'change_emails' %>
    <%= stylesheet_link_tag 'signup', 'password' %>
  <% end -%>

どうしてエラーにならないかは深く追求していないのでわかりませんが、基本的に Viewにロジックを入れるなということですね。

違う書き方

コントローラによって読み込む cssや scriptファイルを切替えるには、こうすればいいそうです。かなりスマートですよね。

 
  (- - snip - -)
  <%= yield :head %>
 
layouts/application.html.erb
 <% content_for :head do %>
  <%= javascript_include_tag 'iepngfix' %>
 <% end %>
foos/bar.html.erb

また「render :partial」のなかに書いて呼び出された回数分だけ includeされてヤダなぁというときは「content_for_once: 一度だけインクルードしたい時に便利なプラグイン - Hello, world! - s21g」を使えばいいそうです。

module ContentForOnce
  def content_for_once(*args, &block)
    @content_for_once ||= {}
    return if @content_for_once[caller[0]]
    @content_for_once[caller[0]] = true
    content_for(*args, &block)
  end
end
http://svn.s21g.com/public/rails/plugins/content_for_once/

呼び出し元を Hashに入れておいて二度目は「content_for」しないということですね。
このほか「RailsでレイアウトをNestさせる方法 - Hello, world! - s21g」というやり方もあるそうです。自分用レイアウト+「application.rhtml」の方が便利な場合が多いので、ちょっと試してみます。