2016-09-17 9 views
6

Для начала, это мнение я пытаюсь повторить:Как использовать lookup_context, чтобы сделать это представление максимально сухим?

screenshot of grades layout

Это HTML от этого расположения (от части SAT в любом случае, вы можете экстраполировать остальное):

<table class="table table-hover table-bordered"> 
         <thead> 
         <td colspan="2" class="text-center"> 
          <strong>SAT</strong> 
         </td> 
         <tr> 
          <th>Subject</th> 
          <th>Grade</th> 
         </tr> 
         </thead> 
         <tbody> 
         <tr> 
          <td>Reading</td> 
          <td>900</td> 
         </tr> 
         <tr> 
          <td>Math</td> 
          <td>700</td> 
         </tr> 
         <tr> 
          <td>Writing</td> 
          <td>800</td> 
         </tr> 
         <tr> 
          <td><strong>Total</strong></td> 
          <td><strong>2,400</strong></td> 
         </tr> 
         </tbody> 

Это то, что моя Grade.rb модель выглядит следующим образом:

# == Schema Information 
# 
# Table name: grades 
# 
# id   :integer   not null, primary key 
# subject :string 
# result  :string 
# grade_type :integer 
# profile_id :integer 
# created_at :datetime   not null 
# updated_at :datetime   not null 
# 

class Grade < ActiveRecord::Base 
    belongs_to :profile 

    enum grade_type: { csec: 0, cape: 1, sat: 2, g7: 3, g8: 4, g9: 5, g10: 6, g11: 7, g12: 8, g13: 9 } 
end 

Это то, что, что таблица выглядит как в данный момент, то есть перед использованием метода lookup_context в Rails:

<table class="table table-hover table-bordered"> 
        <thead> 
        <td colspan="2" class="text-center"> 
         <strong>SAT</strong> 
        </td> 
        <tr> 
         <th>Subject</th> 
         <th>Grade</th> 
        </tr> 
        </thead> 
        <tbody> 
         <% @sat_grades.each do |grade| %> 
         <tr> 
         <% if grade.subject.eql? "Total" %> 
          <td><strong><%= grade.subject %></strong></td> 
          <td><strong><%= grade.result %></strong></td> 
         <% else %> 
          <td><%= grade.subject %></td> 
          <td><%= grade.result %></td> 
         <% end %> 
         </tr> 
         <% end %> 
        </tbody> 

@sat_grades Где это: @sat_grades = @profile.grades.where(grade_type: :sat).

Я хочу использовать этот метод lookup_context, я думал так:

<% @grades.each do |grade| %> 
    <% if lookup_context.template_exists?(grade.grade_type, "grades/grade_types", true) %> 
     <%= render partial: "grade/grade_types/#{grade.grade_type}", locals: {event: event, index: index} %> 
    <% end %> 
    <% end %> 

Проблема Я бегу в том, что каждый grade_type имеет другую таблицу. Таким образом, grade_type: :sat принадлежит к таблице «SAT», то же самое для «CSEC», «g11» и т. Д.

Я не могу придумать, как каждый из этих grade_types, созданный специально в их таблице HTML, без много звонков lookup_context.template_exists?.

Он почти побеждает цель сделать это так, если мне нужно позвонить lookup_context для каждого grade_type.

Каков наилучший способ приблизиться к этому, так что у меня есть только 1 lookup_context звонок (если возможно), но он правильно отображает и обрабатывает все разные оценки правильно.

ответ

2

С данного фрагмента я хотел бы попробовать следующее:

# Render each grade 
<%= render(partial: "grade/grade", collection: @grades, locals: {event: event, index: index}) || "There's grade to be displayed" %> 
# Render Concated content 
<%= content_for :all_grades %> 

В grade/_grade.html.erb:

# If a special grade template exists prepare the content to be shown 
# but don't display it right now 
<% if lookup_context.template_exists?(grade.grade_type, "grades/grade_types", true) %> 
    <%= render partial: "grade/grade_types/#{grade.grade_type}", locals: {event: event, index: index} %> 
<% end %> 

    # Render the common stuff 
    ... 
    # Display the special stuff stored for the grade 
    <%= content_for :grade_table %> 
    # Repeat previous steps 
    ... 

В шаблоне класса (например grade/grade_types/_g7.html.erb):

# remove content from previous grades 
<% content_for :grade_table, flush: true do %> 
    ... 
<% end %> 

<% content_for :xxx_xxx, flush: true do %> 
    ... 
<% end %> 
... 

# Concat content for all grades together (flush: false) 
<% content_for :all_grades do %> 
    ... 
<% end %> 

Другой подход может быть презентатором или, может быть, даже одной таблицей I nheritance.