1

現在、Rails Views の本、Ch 1 - Layouts を読んでいますが、次のエラー メッセージが表示される理由がわかりません。

undefined local variable or method `current_tab' for #`
Extracted source (around line #4):
1: <% content_for :main_navigation do %>
2: <nav id="main_nav" role="navigation">
3:  <ul>
4:      <%= nav_tab 'Home', root_path, current: current_tab %></li>
5:      <%= nav_tab 'Creations', creations_path, current: current_tab %></li>
6:      <%= nav_tab 'Campaigns', campaigns_path, current: current_tab %></li>
7:      <%= nav_tab 'Projects', projects_path, current: current_tab %></li>

app/views/layouts/_main_nav.html.erb:4:in `block in _app_views_layouts__main_nav_html_erb__163583644_37720476'
app/views/layouts/_main_nav.html.erb:1:in `_app_views_layouts__main_nav_html_erb__163583644_37720476'
app/helpers/navigation_helper.rb:9:in `currently_at'
app/views/static_pages/home.html.erb:1:in `_app_views_static_pages_home_html_erb___39106558_37242780'

ミックス内の関連ファイルは次のとおりです。

Application.html.erb

<body>
    <%= render 'layouts/header' %>

_header.html.erb

<header id="page_header" role="banner">
    <nav id="utility">
        <p>
            You are logged in as <strong>Mat Bloody Cauthon</strong>
            <%= link_to "[Your Account]", "#" %> |
            <%= link_to "[Logout]", "#" %>
        </p>
    </nav>
    <%= link_to(image_tag("logo.png", alt: "Artflow", id: "logo"), root_url, title: "Dashboard") %>

    <%= yield :main_navigation %>
</header>

_main_nav.html.erb

<% content_for :main_navigation do %>
<nav id="main_nav" role="navigation">
    <ul>
        <%= nav_tab 'Home', root_path, current: current_tab %></li>
        <%= nav_tab 'Creations', creations_path, current: current_tab %></li>
        <%= nav_tab 'Campaigns', campaigns_path, current: current_tab %></li>
        <%= nav_tab 'Projects', projects_path, current: current_tab %></li>
        <%= nav_tab 'Designers', designers_path, current: current_tab %></li>
    </ul>
</nav>
<% end %>

navigation_helper.rb

module NavigationHelper
    def nav_tab(title, url, options={})
        current_tab = options.delete(:current)
        options[:class] = (current_tab == title) ? 'active' : 'inactive'
        content_tag(:li, link_to(title, url), options)
    end

    def currently_at(tab)
        render 'layouts/main_nav', locals: {current_tab: tab}
    end
end

home.html.erb (ルートパス)

<%= currently_at 'Home' %>

Ruby が物事をロードする順序を理解しようとしているのは、それがその一部である可能性があるからです。私が理解している流れは次のとおりです。

  1. ユーザーはルート ページ (home.html.erb) に移動します
  2. Application.html.erb の読み込み、_header.html.erb の部分的なレンダリング
  3. _header.html.erb は :main_navigation 経由で _main_nav.html.erb を生成します
  4. _main_nav は、nav_helper.rb から nav_tab() を呼び出してリンクを設定します
  5. home.html.erb を生成する Application.html.erb に戻る
  6. Home は、現在のページにナビゲーションを表示する必要がある _main_nav.html.erb パーシャルをレンダリングする navigation_helper.rb から currently_at() を呼び出します。

この進行は正しいですか?もしそうなら、なぜレールはcurrently_atを詰まらせているのcurrent_tabですか?

4

1 に答える 1

1

問題は、私currently_at()の行であることがわかりました:

render 'layouts/main_nav', locals: {current_tab: tab}

の簡略版を使用しているため、渡されるローカル変数を無視しますrender partial:

この行を次のように変更します。

render partial: 'layouts/main_nav', locals: {current_tab: tab}

問題を修正します。

この質問は、私の感覚に到達するのに役立ちました: Render @object and locals vs render :partial

見てくださった方々ありがとうございました、これでみんなでビールを飲みながら悩みを解決できます。(少なくともそれは私の計画です)

于 2013-07-03T13:00:48.510 に答える