我有一个预算模型,我有一个名为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 :(得分:4)
根据您所需的用户体验和限制,有多种可能性。这里有3个。
添加刷新页面的预览按钮。
该按钮会调用将所有数据添加到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
操作后填写。
使用AJAX查询promise
实现将promise
值呈现为纯文本或json的操作,并使用javascript在表单中显示该值。这种方法可以避免页面刷新。
使用javascript计算
在javascript中实现promise
计算的逻辑,并在用户填写表单时显示它。这通常对用户来说是最好的,但有几个缺点。即您需要复制逻辑,在某些情况下甚至可能无法实现。
答案 1 :(得分:1)
取决于你想要的方式。我会给你一个服务器端的解决方案;如果没有人先跳,我也会做ajax
。基本上我们可以劫持熟悉的新 - &gt;方法上的错误 - &gt;再次渲染新流程:
attr_accessor :budget_reviewed
validate :budget_review_needed
errors :add :budget, 'needs to be reviewed' unless budget_reviewed
(语法可能有问题)budget
属性,您需要查找已查看预算的确认。这就是budget_reviewed
进来的地方new
方法中发生)budget_reviewed
- 我们会为视图添加该检查@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
更清晰,但这也是可能的。