如何使用一个复选框更新 table 中的多列?
How do I update multiple columns in a table with one checkbox?
我们正在开发内部 C.M.S。跟踪我们的客户、相关信息,并跟踪这些客户遇到的问题。为此,我们在 "tickets" table 中有几列 - 我们有一个 "completed" 布尔值、一个 "completed_at" 日期时间和一个 "completed_by" 整数。
我们正在尝试提出一些 U.I。我们可以关闭工单的方法 - 在 "Edit Ticket" 页面中,我们希望有一个复选框,我们可以检查它来更新所有三个列:
- "completed"从假到真
- "completed_at" 从 null 到 Time.now
- "completed_by" 从 null 到 current_user.id
我们已经尝试了来自整个网络的几种不同方法,但我们并不完全确定我们将如何做到这一点。
编辑:2018 年 6 月 26 日
这是我们 tickets_controller.rb 中的 "update" 操作:
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 and the tap
method, I'm convinced that @mmichael' s 的解决方案可能是更好的方法,所以我将其标记为答案!
这可以通过 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
请记住,此方法假定 "completing" 票证通过更新操作是不可逆的。您可以添加逻辑以允许反转 "completion"(并因此还原这些属性),但您需要再次更新您的 ticket_params
方法。
如果您不想 tap
强参数,您始终可以根据 completed
复选框的值显式设置属性。这也将允许您通过检查 completed
复选框的 false
值来反转 "completion"。
这些只是可以实现的几种方法。你当然有选择。
我们正在开发内部 C.M.S。跟踪我们的客户、相关信息,并跟踪这些客户遇到的问题。为此,我们在 "tickets" table 中有几列 - 我们有一个 "completed" 布尔值、一个 "completed_at" 日期时间和一个 "completed_by" 整数。
我们正在尝试提出一些 U.I。我们可以关闭工单的方法 - 在 "Edit Ticket" 页面中,我们希望有一个复选框,我们可以检查它来更新所有三个列:
- "completed"从假到真
- "completed_at" 从 null 到 Time.now
- "completed_by" 从 null 到 current_user.id
我们已经尝试了来自整个网络的几种不同方法,但我们并不完全确定我们将如何做到这一点。
编辑:2018 年 6 月 26 日
这是我们 tickets_controller.rb 中的 "update" 操作:
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 and the tap
method, I'm convinced that @mmichael' s 的解决方案可能是更好的方法,所以我将其标记为答案!
这可以通过 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
请记住,此方法假定 "completing" 票证通过更新操作是不可逆的。您可以添加逻辑以允许反转 "completion"(并因此还原这些属性),但您需要再次更新您的 ticket_params
方法。
如果您不想 tap
强参数,您始终可以根据 completed
复选框的值显式设置属性。这也将允许您通过检查 completed
复选框的 false
值来反转 "completion"。
这些只是可以实现的几种方法。你当然有选择。