我有一个表格,其中包含以下表格的示例:
<%= 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
答案 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等)进行双重计算。否则,您将继续添加分数适用于bio
和portfolios
等。
或者,如果您只想显示动态计算的分数,您可以在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