首先,这是我要复制的 View :

ruby-on-rails - 如何使用lookup_context使该 View 尽可能干燥?-LMLPHP

这是该布局中的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

这是该表的当前外观,即在Rails中使用lookup_context方法之前:
<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”等相同。

我想不出一种方法来专门在其HTML表中呈现每个grade_types,而在该 View 中没有很多lookup_context.template_exists?调用。

如果我必须为每个lookup_context调用grade_type,那么这样做几乎达到了这样做的目的。

解决这个问题的最佳方法是什么,所以我只有1个lookup_context调用(如果可能的话),但是它可以正确地正确渲染和处理所有不同的等级。

最佳答案

对于给定的片段,我将尝试以下操作:

# 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 %>

另一种方法可以是演示者,甚至可以是单表继承。

关于ruby-on-rails - 如何使用lookup_context使该 View 尽可能干燥?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39546711/

10-14 06:46