我们正在开发内部C.M.S.跟踪我们的客户,相关信息并跟踪那些客户遇到的问题。为此,我们在“票证”表中有几列-我们有一个“ completed”布尔值,一个“ completed_at”日期时间和一个“ completed_by”整数。
我们正在尝试提出几个U.I.关闭票证的方法-在“编辑票证”页面中,我们希望有一个复选框,我们可以检查该复选框来更新所有这三列:
我们在网络上尝试了几种不同的方法,但是我们不确定如何做到这一点。
编辑:2018年6月26日
这是在tickets_controller.rb中的“更新”操作:
def update
respond_to do |format|
if @ticket.update(ticket_params)
format.html { redirect_to @ticket, notice: 'Ticket was successfully updated.' }
format.json { render :show, status: :ok, location: @ticket }
else
format.html { render :edit }
format.json { render json: @ticket.errors, status: :unprocessable_entity }
end
end
end
编辑: 2018年6月27日
这是我最终找到的解决方案。在routes.rb
中,我进行了更改:
resources :tickets
收件人:
resources :tickets do
member do
patch :close_ticket
end
end
然后,在我们的Tickets控制器中,添加了以下功能:
def close_ticket
@ticket = Ticket.find(params[:id])
@ticket.update(:completed => true, :completed_at => Time.now, :completed_by => current_user.id)
redirect_to root_path, notice: "Ticket ##{@ticket.id} was successfully closed."
end
这样,我就可以在任何视图中添加以下按钮:
<%= link_to "Close", close_ticket_ticket_path(ticket), method: :patch, class: "btn btn-sm btn-warning table-btn" %>
似乎可以很好地工作,甚至可以隐藏视图中的某些内容,以便精明的用户无法输入错误的日期数据,这很好-但是在阅读了strong parameters和{ {1}}方法,我确信@mmichael的解决方案可能是更好的方法,因此我将其标记为答案!
答案 0 :(得分:0)
使用check_box_tag可以轻松完成此操作。
例如,在您的编辑表单视图中(假设您使用的是强参数):
<%= check_box_tag 'ticket[completed]', @ticket.id %>
然后,您只需在控制器中更新ticket_params
:
def ticket_params
params.require(:ticket).permit(..., :completed).tap do |params|
if params[:completed]
params[:completed] = true
params[:completed_at] = Time.now
params[:completed_by] = current_user.id
end
end
end
请记住,此方法假设通过更新操作“完成”票是不可逆的。您可以添加逻辑以允许反转“完成”(并因此还原那些属性),但是您需要再次更新ticket_params
方法。
如果您不想使用tap
强参数,则始终可以根据该completed
复选框的值来显式设置属性。这还将使您可以通过检查false
复选框的completed
值来逆转“完成”。
这些只是完成此操作的几种方法。您当然有选择。