0

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

目前,我正在使用以下内容在我的 Show 视图中显示总数,但是有一个 :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

Symptom 控制器的创建部分:

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
4

2 回答 2

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

于 2013-05-22T19:53:16.363 回答
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,您将即时添加其他属性。缺点是您不能直接操纵 total 的值(例如,您不能说@symptom.total += 1),但这是您可能永远不想做的事情(甚至可能会主动阻止)。

于 2013-05-22T21:56:50.573 回答