2016-03-09 3 views
0

У меня есть форма, которая принимает в грузах данных Ниже приведен пример формы:рельсов формы выдает счет

<%= 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) принадлежит к пользователю, созданному по завещанию. То, что я пытаюсь сделать, это, например, если пользователь заполняет свою биографию, он получает баллы (+2 балла), и за каждый портфель он добавляет, что получает больше (+5 очков), а в конце формы счет рассчитывается.

что-то вроде этого

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

что ваш вопрос? – toddmetheny

ответ

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 
+0

Что я забыл добавить в исходный код выше, так это то, что «оценка» - это столбец, где оценка должна быть сохранена. Я пробовал self.score, но он не работает? –

+0

как я могу сохранить это в столбце в таблице профиля, называемой оценка? –

+0

Вы получаете какую-либо ошибку при попытке использовать первый подход использования 'before_save: assign_score'? Если вы не пытаетесь либо добавить инструкции 'puts', либо отладчик в метод' assign_score' и проделать шаги. – Dharam

Смежные вопросы