rails 在创建前显示计算字段
rails show calculated field before create
我有一个预算模型,其中有一个名为 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
我想在保存之前向预算创建者(用户)显示 controller/view 中计算的值。在将其保存到 promise
列之前,用户应该能够对其进行编辑。
我目前正在寻找如何实施流程和呈现计算值的想法。
取决于你想怎么做。我会给你一个服务器端的解决方案;如果没有人先加入,我也会加入 ajax
。基本上我们可以劫持熟悉的 new -> errors on method -> render new again 流程:
- 为您的模型添加 'virtual' 布尔属性
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
更干净,但这也是可能的。
根据您想要的用户体验和限制,有多种可能性。这是其中的 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
计算的逻辑,并在用户填写表格时显示它。这通常对用户来说看起来和感觉最好,但有几个缺点。也就是说,您需要复制您的逻辑,在某些情况下甚至可能是不可能的。
我有一个预算模型,其中有一个名为 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
我想在保存之前向预算创建者(用户)显示 controller/view 中计算的值。在将其保存到 promise
列之前,用户应该能够对其进行编辑。
我目前正在寻找如何实施流程和呈现计算值的想法。
取决于你想怎么做。我会给你一个服务器端的解决方案;如果没有人先加入,我也会加入 ajax
。基本上我们可以劫持熟悉的 new -> errors on method -> render new again 流程:
- 为您的模型添加 'virtual' 布尔属性
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
更干净,但这也是可能的。
根据您想要的用户体验和限制,有多种可能性。这是其中的 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
计算的逻辑,并在用户填写表格时显示它。这通常对用户来说看起来和感觉最好,但有几个缺点。也就是说,您需要复制您的逻辑,在某些情况下甚至可能是不可能的。