Rails SimpleForm算术计算创建

时间:2013-05-22 19:28:20

标签: ruby-on-rails forms simple-form

对于我的第一个Rails项目,我正在尝试使用SimpleForm gem创建一个表单。表格中有单选按钮格式的问题,每个答案都有一个与之相关的分数(1-4)。我的目的是让表格将每个问题的分数(:vision_problems,:balance_issues,:nausea)相加,并在用户提交表单后将总分保存到单独的列(:total)中。解决这个问题的最佳方法是什么?

目前,我正在使用以下内容在我的“显示”视图中显示总数,但是:总列数会更好:

<%= @total = @symptom.nausea + @symptom.balance_issues + @symptom.vision_problems %>

感谢您的帮助。

视图中的表单部分:

<%= simple_form_for(@symptom) do |f| %>
<%= f.error_notification %>
<%= f.input :vision_problems, label_html: { class: "buttonhead" }, collection: [ 1 , 2, 3,      
4 ], as: :radio_buttons %>
<%= f.input :balance_issues, label_html: { class: "buttonhead" }, collection: [ 1 , 2, 3,  
4 ], as: :radio_buttons %>
<%= f.input :nausea, label_html: { class: "label label-info" }, collection: [ 1 , 2,  3,    
4 ], as: :radio_buttons %>
<%= f.button :submit, class: "btn btn-primary" %>
<% end %>

症状模型:

class Symptom < ActiveRecord::Base

attr_accessible :description, :vision_problems, :balance_issues, :nausea, :user_id, :total

belongs_to :user

validates :user_id, presence: true 
end

症状控制器的创建部分:

def create
@symptom = current_user.Symptoms.new(params[:symptom])

respond_to do |format|
  if @symptom.save
    format.html { redirect_to @symptom, notice: 'Symptom was successfully created.' }
    format.json { render json: @symptom, status: :created, location: @symptom }
  else
    format.html { render action: "new" }
    format.json { render json: @symptom.errors, status: :unprocessable_entity }
  end
end
end

2 个答案:

答案 0 :(得分:0)

您可以使用回调来在保存对象时生成总计。

照常添加总列

add_column :symptoms, :total, :integer

向症状模型添加回调:

before_validation :update_total

def update_total
  total = nausea + balance_issues + vision_problems
end

在决定回调链中您希望发生这种情况的位置时,有几个选项可供选择。

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

答案 1 :(得分:0)

直接解决方案(如果我理解你要求的话)是在保存之前在控制器的total方法中设置create属性;即添加行

@symptom.total = @symptom.nausea + @symptom.balance_issues + 
                 @symptom.vision_problems

但我得到的印象是,您真正需要的是方法或虚拟属性(即,通过您自己定义的方法获取和设置的属性,而不是映射到数据库柱)。您可以将其定义为模型方法,而不是创建名为total的表列:

class Symptom < ActiveRecord::Base
  attr_accessible :description, :vision_problems, :balance_issues, 
                  :nausea, :user_id
  def total
    nausea + balance_issues + vision_problems
  end
end

然后,当您使用@symptom.total时,您正在动态添加其他属性。缺点是您无法直接操纵总计的值(例如,您不能说@symptom.total += 1),但这是您可能永远不想做的事情(或者甚至可能主动阻止)。