Ruby on rails rails在创建之前显示计算字段
我有一个预算模型,其中有一个方法叫做Ruby on rails rails在创建之前显示计算字段,ruby-on-rails,model,wizard,actioncontroller,Ruby On Rails,Model,Wizard,Actioncontroller,我有一个预算模型,其中有一个方法叫做calculate\u 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 ca
calculate\u 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
class预算
我想在保存之前向预算创建者(用户)显示在控制器/视图中计算的值。在将其保存到promise
列之前,用户可能应该能够对其进行编辑
我目前正在寻找如何实现流程并显示计算值的想法。取决于您希望如何实现。我将为您提供一个服务器端解决方案;如果没有人先插手,我也会做
ajax
。基本上,我们可以劫持熟悉的new->errors on method->render new reach流程:
- 为您的模型添加“虚拟”布尔属性
- 让您的预算方法进行验证:需要进行预算审查
- 该方法应该会出现错误:添加:预算,“需要审核”,除非预算已审核(语法可能错误)
- 要添加“实际预算”属性,您需要查看是否已审核预算。这就是审查预算的地方
- 让用户输入他们的预算数据(例如,这将发生在控制器的
方法中)new
- 他们将无法在参数中输入
——我们将为视图添加该检查budget\u revieved
- 首先绕过
它将失败,并在@budget=budget.new(预算参数)@调用budget.save
上出错:需要查看带有文本
的budget
def create
@budget = Budget.new budget_params
if @budget.save
redirect_to budgets_path
else
render 'new'
end
end
- 在视图中查找该错误,如果发现该错误,则同时显示已计算的预算,并在表单中添加一个复选框,该复选框显示“我已审阅预算”
- 如果用户单击复选框,则该值应通过
进入参数
的属性,并应在知道预算已确认的情况下保存@budget
- 利润(双关语)
可以说,
ajax
更干净,但这也是可能的。取决于您想要如何做。我将为您提供一个服务器端解决方案;如果没有人先插手,我也会做ajax
。基本上,我们可以劫持熟悉的new->errors on method->render new reach流程:
- 为您的模型添加“虚拟”布尔属性
- 让您的预算方法进行验证:需要进行预算审查
- 该方法应该会出现错误:添加:预算,“需要审核”,除非预算已审核(语法可能错误)
- 要添加“实际预算”属性,您需要查看是否已审核预算。这就是审查预算的地方
- 让用户输入他们的预算数据(例如,这将发生在控制器的
方法中)new
- 他们将无法在参数中输入
——我们将为视图添加该检查budget\u revieved
- 首先绕过
它将失败,并在@budget=budget.new(预算参数)@调用budget.save
上出错:需要查看带有文本
的budget
def create
@budget = Budget.new budget_params
if @budget.save
redirect_to budgets_path
else
render 'new'
end
end
- 在视图中查找该错误,如果发现该错误,则同时显示已计算的预算,并在表单中添加一个复选框,该复选框显示“我已审阅预算”
- 如果用户单击复选框,则该值应通过
进入参数
的属性,并应在知道预算已确认的情况下保存@budget
- 利润(双关语)
可以说,
ajax
更干净,但这也是可能的。根据您想要的用户体验和限制,有几种可能性。这里有三个
预算
,并在不保存预算的情况下渲染回相同的视图。然后,用户可以更改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
class BudgetController
使用此控制器,只需将promise
字段添加到您的视图中,在将数据提交到preview
操作后,该字段将被填充
promise
实现将promise
值呈现为纯文本或json的操作,并使用javascript在表单中显示该值。这种方法可以避免页面刷新promise
计算的逻辑,并在用户填写表单时显示。这通常对用户来说是最好的外观和感觉,但也有一些缺点。也就是说,你需要复制你的逻辑,在某些情况下甚至是不可能的