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
    操作后,该字段将被填充

  • 使用AJAX查询
    promise

    实现将
    promise
    值呈现为纯文本或json的操作,并使用javascript在表单中显示该值。这种方法可以避免页面刷新

  • 用javascript计算它

    用javascript实现
    promise
    计算的逻辑,并在用户填写表单时显示。这通常对用户来说是最好的外观和感觉,但也有一些缺点。也就是说,你需要复制你的逻辑,在某些情况下甚至是不可能的

  • 有几种可能