使用state_machine更改费用的状态

时间:2014-08-13 05:01:55

标签: ruby-on-rails

我正在尝试使用Rails 4.1构建一个小费用跟踪应用。当用户提交费用请求时,默认情况下将其状态标记为待处理。管理员必须批准该请求。我使用state_machine gem来做到这一点。

目前,Expense模型看起来像这样

state_machine initial: :pending do
  state :pending
  state :approved

  event :approved do
    transition :pending => :approved
  end
end

当有人创建新的费用报告时,它会自动标记为待处理。我想到的工作流程是管理员将访问费用/显示页面并使用下拉菜单批准费用。但是,我不太确定能够以Rails的方式完成这项工作。

我尝试使用:

<%= form_for @expense do |f| %>
  <%= f.label :state_event %><br />
  <%= f.collection_select :state_event, @expense.state_transitions, :event, :human_to_name, :include_blank => @expense.human_state_name %>
  <%= f.submit %>
<% end %>

在费用/显示页面(我猜这是一种愚蠢的方式来做到这一点)。闪存通知表示费用已更新,但状态更改并未反映在数据库中。 更新操作如下所示:

def update
  @expense = Expense.find(params[:id])
  if @expense.save(expense_params)
    flash[:notice] = "Expense Report Updated"
    redirect_to @expense
  else
    render 'edit'
  end
end

private

def expense_params
  params.require(:expense).permit(:claim, :department_id, :expense_type_id, :expense_attachment, :state, :notes, items_attributes: [:id, :description, :amount, :issue_date, :_destroy])
end

有人可以建议如何完成这个吗?

1 个答案:

答案 0 :(得分:1)

问题是save(expense_params)不会使用参数更新记录。相反,请使用update

@expense.update(expense_params)