首页 > 解决方案 > 如何使用一个复选框更新表中的多个列?

问题描述

我们正在开发一个内部 CMS 来跟踪我们的客户、相关信息并跟踪这些客户遇到的问题。为此,我们的“tickets”表中有几列——我们有一个“completed”布尔值、一个“completed_at”日期时间和一个“completed_by”整数。

我们正在尝试提出几个 UI 方法来关闭工单 - 在“编辑工单”页面中,我们希望有一个复选框,我们可以检查它会更新所有这三个列:

  1. “完成”从假到真
  2. "completed_at" 从 null 到 Time.now
  3. “completed_by” 从 null 到 current_user.id

我们已经从网络上尝试了几种不同的方法,但我们并不完全确定我们将如何做到这一点。


编辑: 2018 年 6 月 26 日

这是我们的 ticket_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

然后,在我们的门票控制器中,我添加了以下功能:

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" %>

似乎工作得很好,甚至可以从视图中隐藏某些内容,这样精明的用户就无法输入错误的日期数据,这很好 - 但是在阅读了强大的参数tap方法后,我确信@mmichael的解决方案可能是更好的方法,所以我将其标记为答案!

标签: ruby-on-railsdatabaseformscheckboxruby-on-rails-5.2

解决方案


这可以通过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

这些只是可以做到这一点的几种方法。你当然有选择。


推荐阅读