2015-09-15 5 views
0

У меня есть модель бюджета, где у меня есть метод, называемого calculate_budgetрельсов показать вычисляемое поле, прежде чем создать

class Budget < ActiveRecord::Base 

# Assoziations 
    belongs_to :member 
    belongs_to :donation 

# Callbacks 
    after_create :calculate_budget, :transfer_old_remaining_promise_to_current_budget 

# Public: It is called immediatly after creating (callback) a budget model and it's 
#   calculating the budget "promise" (column) based on "donation formula" 
#   and income of the member. 
# 
# Returns: 
#   true or false 
    def calculate_budget 
    ... 
    ... 
    end 

Я хочу показать в бюджете создатель (пользователь) значение, которое вычисляется в контроллере/представлении перед тем сохраняя его. Потенциально пользователь должен иметь возможность редактировать его, прежде чем сохранять его в столбце promise.

В настоящее время я ищу идею о том, как реализовать поток и представить рассчитанное значение.

+0

Вам нужно будет сделать это на стороне клиента или сделать запрос AJAX. – BroiSatse

+0

как @BroiSatse сказал, что создайте новое действие в контроллере, скажем, 'projected_budget', подсчитайте свой бюджет и покажите его пользователю. делать все это при вызове ajax –

ответ

4

Существует несколько возможностей в зависимости от желаемого пользовательского опыта и ограничений. Вот 3 из них.

  1. Добавить кнопку предварительного просмотра, которая обновляет страницу.

    Эта кнопка вызовет действие, которое добавит все данные в Budget и отобразит обратно тот же вид, не сохраняя Budget. Затем пользователь сможет изменить значение promise, а затем отправить форму.

    class BudgetsController < ApplicationController 
        def new 
        @budget = Budget.new 
        end 
    
        def create 
        @budget = Budget.new(create_params) 
        ... # save, redirect and whatever else 
        end 
    
        def preview 
        @budget = Budget.new(create_params) 
        # Check validity of the data if calculate_budget does not 
        @budget.calculate_budget # Assuming this method does not save the budget 
        render :new 
        end 
    
        ... 
    end 
    

    С помощью этого контроллера, просто добавьте promise поля на ваш взгляд, и он будет заполнен после подачи данных в preview действия.

  2. запрос к promise использованием AJAX

    Выполнить действие, которое оказывает значение promise как простой текст или JSON и использовать JavaScript для отображения этого значения в форме. Такой подход позволит избежать обновления страницы.

  3. Вычислить его яваскрипт

    Реализовать логику вашего promise вычисления в JavaScript и отображать его как пользователь заполняет форму. Это обычно выглядит и чувствует себя лучше всего для пользователя, но имеет несколько недостатков. А именно тот факт, что вам нужно дублировать свою логику и в некоторых случаях, может быть даже невозможен.

1

Зависит от того, как вы хотите это сделать. Я дам вам серверное решение; если никто не прыгнет первым, я сделаю ajax. В принципе, мы можем захватить знакомую новый -> ошибки в методе -> Render новые снова течь:

  • Добавить «виртуального атрибута» булева для вашей модели attr_accessor :budget_reviewed
  • Есть свой метод бюджетного сделать validate :budget_review_needed
  • Этого метода должен сделать errors :add :budget, 'needs to be reviewed' unless budget_reviewed (может быть неправильный синтаксис)
  • Чтобы добавить фактический атрибут budget, вам необходимо найти подтверждение, что вы просмотрели бюджет. Вот где budget_reviewed приходит в
  • Have пользователя ввести свои данные бюджета (это произойдет в new методы вашего контроллера, например)
  • Они не будут иметь возможность войти budget_reviewed в Params - мы добавим, что чек вид
  • Сначала идут вокруг этого @budget = Budget.new(budget_params); @budget.save вызывается он потерпит неудачу с ошибкой на :budget с текстом needs to be reviewed

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

def create 
    @budget = Budget.new budget_params 
    if @budget.save 
    redirect_to budgets_path 
    else 
    render 'new' 
    end 
end 
  • Посмотрите на эту ошибку на вашем взгляде, и если вы обнаружите, что оба показывают вычисленный бюджет и добавить флажок в форме, которая говорит I have reviewed the budget
  • Если пользователь нажимает на флажок, то значение должно проходить через params в ваши атрибуты для @budget, и следует сохранить, зная, что бюджет подтвержден.
  • Прибыль (каламбур)

Возможно ajax чище, но это также возможно.

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