如何使索引链接和显示操作在部分视图中起作用

How to make links for index and show actions work in partial views

我正在使用局部渲染我所有页面中布局文件夹中的导航栏,并且在导航栏中我有指向操作的链接,例如来自 GradesController 的索引和显示。我明白,为了使链接正常工作,我必须在控制器中该页面的操作中这样调用它们:

def home
  @grades = Grade.all 
end

然而,由于这些链接存在于 局部视图 中,它没有相应的控制器,我如何才能使这些链接正常工作而不会出现 NoMethodError?

layouts/_navbar.html.erb

<div class="main_nav_color">
  <div class="wrapper">
    <header id="main_header" class="cf">
      <a href="#" id="logo">arabecademy</a>
        <nav>
          <ul>
            <li>
              <%= link_to "#" do %>
                Grade<span class="glyphicon glyphicon-chevron-down"></span>
              <% end %>
              <ul>
               <% @grades.each do |grade| %>
                  <li><%= link_to "Grade" + grade.grade_number, grade_courses_path(grade, @course) %></li>
                <% end %>
              </ul>
            </li>
            <li><a href="#">About</a></li>
            <li><a href="#">Contact</a></li>
            <% if student_signed_in? %>
            <li><%= link_to "Log Out", destroy_student_session_path, method: :delete %></li>
            <li><%= link_to "Accout Settings", edit_student_registration_path %></li>
            <% else %>
            <li><%= link_to "Log in", new_student_session_path %></li>
            <li><%= link_to "Sign Up", new_student_registration_path, :class => "button_sm button_orange" %></li>
            <% end %>
          </ul>
        </nav>
    </header>
  </div>
</div>

要始终设置 @grades,您可以像这样在 ApplicationController 中添加 before_filter

class ApplicationController
  before_action :load_grades

  def load_grades
    @grades = Grade.all
  end
end

这将确保除了动作本身所做的任何事情之外,每个控制器动作都有 @grades 设置。您的部分应该能够在您现在显示的任何地方获取 @grades