高级视图中的Rails:对视图和控制器之间的模型值执行计算

时间:2015-04-18 21:29:34

标签: mysql ruby ruby-on-rails-4 model-view-controller

这一定是一个共同的需求,但我似乎无法找到最明确的回答方式。我需要创建一个相当复杂的算法来动态计算rails 4.1 app中的课程成绩。

具体来说,我有一个模型,"课程",每当视图中显示一个实例时,我想动态计算当前等级(十进制值,从许多课程计算.field值)并使用开关/案例将其显示为字母值。我的假设是我可以在控制器中执行此操作(但它似乎很复杂,足以保证它自己的模块?在C ++中我会创建一个类)。同时,由于它是动态创建的,在模型中为它​​创建一个current_grade字段似乎是不好的形式,所以它不能作为允许的参数之一来回传递(我是知道 - 可以传递一个未在数据库中表示的参数中的变量吗?)。

在我最初的研究中,我看到了hidden_​​field_tags和helper_methods以及all_helpers和模块以及全局模块等的建议。在时间压力下,我害怕从错误的道路开始。哪种方法更好?还是一个很好的高级文档供参考?

作为一个例子,这里有一个视图,我想计算当前等级,将其与所需等级进行比较,并相应地显示。

# index.html.erb
<% @courses.each do |course| %>
  <li>
    <%= my_algorithm_to_calculate_curr_grade(many course.fields used to caluculate) 
    <= course.desired_grade ? "set li to <Color: red>" : "set li to <Color: green>" %>   
    <%= course.course_name %>     
    Current Calculation: <%= display_results_of_previous_calculation %>   
    (Goal: <%= course.desired_grade %>)   
    <%= link_to 'Show', course %>   
    <%= link_to 'Edit', edit_course_path(course) %>   
    <%= link_to 'Drop Course Without Penalty', course, method: :delete, data: { confirm: 'Are you sure?' } %>
  </li>        
<% end %>

1 个答案:

答案 0 :(得分:1)

如果course.fields是课程或不同模型的属性,则很难从您的问题中判断出来。如果所有字段都是课程属性,我会把它作为课程的实例方法。

class Course < ActiveRecord::Base
  def calculated_grade
    # fun algorithm
  end
end

如果需要从数据库加载course.fields,我可能会使用普通的旧Ruby对象(PO​​RO),也许称之为CourseGradeCalculator(把它放在app / models中,为什么不呢?它&#39 ; s业务逻辑)

class CourseGradeCalculator
  attr_reader :course, :fields, :grade
  def initialize(course, fields)
    @course = course
    @fields = fields
    @grade = calculate_grade
  end

  private

  def calculate_grade
    # fun algorithm
  end
end

# controller
@course = Course.preload(:fields).find(params[:id]

# view
CourseGradeCalculator.new(@course, @course.fields)