の不可思議なエラー
NetBeansで Railsを書くようになってから、事前(実行前)にエラーや警告がわかるようになってすごく助かるんですが、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で実行したところ(書いてて思ったんですが、Windowsと Ubuntuの違いじゃなくて、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 endhttp://svn.s21g.com/public/rails/plugins/content_for_once/
呼び出し元を Hashに入れておいて二度目は「content_for」しないということですね。
このほか「RailsでレイアウトをNestさせる方法 - Hello, world! - s21g」というやり方もあるそうです。自分用レイアウト+「application.rhtml」の方が便利な場合が多いので、ちょっと試してみます。