【问题标题】:How do I update multiple columns in a table with one checkbox?如何使用一个复选框更新表中的多个列?
【发布时间】:2018-06-26 18:17:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails database forms checkbox ruby-on-rails-5.2


    【解决方案1】:

    这可以通过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 复选框的 false 值来反转“完成”。

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

    【讨论】:

    • 有趣!我刚刚开始熟悉 Ruby on Rails(使用 5.2 版),所以我不确定我是否熟悉 tap 方法,但这似乎是非常有趣的代码!我找到了一个不同的解决方案(我将更新我的帖子以包括在内),但我曾想过像你这样的方法,但不知道你可以在 &lt;model&gt;_params 语句中设置参数!这非常有帮助,我很感激!
    • 您的解决方案完全可以接受。我要添加的一件事是在进行更新之前检查票证是否已经关闭的一些逻辑。另外,请记住 update 将静默失败(返回 false),因此对于您当前的代码,您实际上并没有错误处理。您可以使用update!,如果更新失败会引发异常,或者检查update 是否成功/失败并根据需要进行渲染/重定向。
    猜你喜欢
    • 2017-04-23
    • 2019-01-22
    • 1970-01-01
    • 2013-11-15
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2022-01-25
    相关资源
    最近更新 更多