我正在尝试使用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
有人可以建议如何完成这个吗?
答案 0 :(得分:1)
问题是save(expense_params)
不会使用参数更新记录。相反,请使用update
:
@expense.update(expense_params)