【问题标题】:undefined local variable current_tab - Rails Views Book Ch 1未定义的局部变量 current_tab - Rails Views Book Ch 1
【发布时间】:2023-03-20 21:29:01
【问题描述】:

我目前正在阅读 Rails 视图一书,第 1 章 - 布局,但不知道为什么我不断收到以下错误消息:

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 (root_path)

<%= 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 从 navigation_helper.rb 调用 nav_tab() 来设置链接
  5. 返回生成 home.html.erb 的 Application.html.erb
  6. Home 从 navigation_helper.rb 调用 current_at() 渲染 _main_nav.html.erb 部分,它应该在当前页面上显示导航。

这个进程正确吗?如果是这样,为什么 rails 会在 currently_at 上阻塞,这看起来像是设置了 current_tab

【问题讨论】:

  • @DaveNewton current_tab 是 main_nav 局部变量的局部变量,它被传递给辅助函数并从中提取。
  • @ChrisHeald 哦,它是-错过了它。
  • 发现问题。事实证明,问题在于在我的currently_at 函数中使用render 作为render partial: 的简写形式很棘手。仅使用render 显然会忽略传递的局部变量,因此我需要使用完整语法render partial:
  • 太差了还没来得及回答我自己的问题,将在此处发布以备后用:

标签: ruby-on-rails partials


【解决方案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

感谢那些看过的人,现在我们都可以去喝杯啤酒了。 (至少这是我的计划)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多