Как обновить несколько столбцов в таблице с помощью одного флажка? - PullRequest
0 голосов
/ 26 июня 2018

Мы разрабатываем собственный C.M.S. отслеживать наших клиентов, соответствующую информацию и отслеживать проблемы, с которыми сталкиваются эти клиенты. Для этого у нас есть пара столбцов в нашей таблице «tickets» - у нас есть «завершенное» логическое значение, «завершение-дата» и целое число завершено.

Мы пытаемся придумать пару U.I. методы, с помощью которых мы могли бы закрыть заявку - и на странице «Редактировать заявку» мы хотим иметь один флажок, который мы могли бы проверить и который обновил бы все три из этих столбцов:

  1. «завершено» от ложного до истинного
  2. "complete_at" от нуля до Time.now
  3. "complete_by" от null до current_user.id

Мы испробовали несколько разных подходов со всего Интернета, но мы не совсем уверены, как мы это сделаем.


РЕДАКТИРОВАТЬ: 26 июня 2018

Вот наше действие «обновить» в нашем 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

РЕДАКТИРОВАТЬ: 27 июня 2018

Вот решение, к которому я в конце концов пришел. В 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" %>

Кажется, что работает довольно хорошо и даже скрывает некоторые вещи из представления, так что опытный пользователь не может вводить неверные данные даты, если он хочет, что хорошо, но при чтении сильных параметров и метод tap, я убежден, что решение @ mmichael , вероятно, является лучшим подходом, поэтому я отмечаю его как ответ!

1 Ответ

0 голосов
/ 27 июня 2018

Это легко сделать с помощью 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.

И это всего лишь несколько способов сделать это. У вас наверняка есть варианты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...