rails表格输出得分

时间:2016-03-09 20:46:49

标签: ruby-on-rails ruby-on-rails-4

我有一个表格,其中包含以下表格的示例:

<%= form_for(@profile) do |f| %>
  <% if @profile.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@profile.errors.count, "error") %> prohibited this profile from being saved:</h2>
      <ul>
      <% @profile.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

<form>

<div class="form-group">
    <label for="Email">Small bio about yourself</label>
    <%= f.text_area :bio, :class => "form-control", :id => "Email", :rows => "3",
      :placeholder => "bio here"%>
  </div>

<div class="field">
    <%= f.fields_for :portfolios do |portfolio| %>
      <%= render partial: 'partials/portfolio_fields', :f => portfolio  %>
    <% end %>
    <div class="links">
      <%= link_to_add_association 'add image', f, :portfolios %>
    </div>
  </div>

</form>
<% end %>

配置文件(scaffolded)属于由devise创建的用户。我试图做的是,例如,如果用户填写他的生物,他得到一个分数(+2分),并且他添加的每个投资组合他获得更多(+5分)并且在形式结束时分数计算。

类似这样的事情

if bio.empty?
 score = 3
else
 score = 0
end

1 个答案:

答案 0 :(得分:1)

如果您想在填写信息(例如:生物,投资组合)等时向用户显示分数,那么您需要查看使用javascript在客户端实施。

但是如果您想在表单提交时将其保存到profiles表并稍后向用户显示该信息,那么您可以通过Profile模型上的回调实现它,如下所示:

class Profile < ActiveRecord::Base
  belongs_to :user

  before_save :assign_score

  protected
  def assign_score
    score = self.score || 0
    score += 3 if self.changes.include?(:bio) and self.bio.present?
    score += 5 if self.portfolios.present?

    self.score = score
  end
end

这种方法的问题在于,每次更新profile记录时,您都需要确保不通过存储其他信息(如bio_calculated等)进行双重计算。否则,您将继续添加分数适用于bioportfolios等。

或者,如果您只想显示动态计算的分数,您可以在Profile模型中定义自定义方法,如下所示:

class Profile < ActiveRecord::Base
  belongs_to :user

  def score
   score = 0
   score += 3 if self.bio.present?
   score += 5 * self.portfolios.count
   score # this last line is optional, as ruby automatically returns the last evaluated value, but just added for explicity
  end
end