【问题标题】:rails show calculated field before createrails 在创建之前显示计算字段
【发布时间】:2015-12-11 19:35:55
【问题描述】:

我有一个预算模型,其中我有一个名为 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 列之前对其进行编辑。

我目前正在寻找如何实现流程并呈现计算值的想法。

【问题讨论】:

  • 您需要在客户端执行此操作或发出 AJAX 请求。
  • 正如@BroiSatse 所说,在控制器中创建一个新操作让projected_budget 在其中计算您的预算并将其显示给用户。在 ajax 调用中完成所有这些操作

标签: ruby-on-rails model wizard actioncontroller


【解决方案1】:

取决于你想怎么做。我会给你一个服务器端的解决方案;如果没有人先跳进去,我也会这样做ajax。基本上我们可以劫持熟悉的 new -> 方法错误 -> 再次渲染新流程:

  • 为您的模型添加一个“虚拟”布尔属性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 更干净,但这也是可能的。

【讨论】:

    【解决方案2】:

    根据您想要的用户体验和限制,有多种可能性。这是其中的 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. 使用 AJAX 查询promise

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

    3. 用javascript计算

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      • 2019-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多