Как создать метод для конкретных значений в столбце из таблицы? - PullRequest
0 голосов
/ 17 ноября 2018

Проблема: я ищу способ иметь отдельные уведомления для разных значений в столбце таблицы.

У меня есть order_status, который имеет 3 отдельных значения, созданных, отмененных и начисленных.

Мне бы хотелось иметь 3 отдельных уведомления для каждого, когда столбцы меняются из вида.

представление будет выглядеть примерно так:

<%= form_for @order, remote: true do |f| %>
    <%= f.hidden_field :order_status, value: "cancelled" %>
    <%= f.button type:'submit', class: "btn btn-danger" %>
<% end %>

Это изменит столбец на «отмененный».

Затем я хочу создать метод, подобный:

  def cancel_update
    respond_to do |format|
      if @order.update(params[:order_update])
        if user_signed_in?
          if @order.order_status = "cancelled"

            format.html { redirect_to @order, notice: 'Order was successfully cancelled.' }
            format.json { render :show, status: :ok, location: @order }
          else
            format.html { render :edit }
            format.json { render json: @order.errors, status: :unprocessable_entity }
          end
        end
      end
    end
  end

Но этот метод не сработал так, как я планировал. Когда я использую этот метод, ничего не происходит, когда я нажимаю кнопку, нет перезагрузки страницы, перенаправления и т. Д. Я получаю сообщение об ошибке: «Не удалось найти действие« обновление »для OrdersController» (Это было проверено путем удаления оригинального метода обновления - ниже).

Теперь, когда я использую этот метод обновления, он работает, но не указывает точку обновления значения только для order_status.

def update
    respond_to do |format|
      if @order.update(order_params)
        if user_signed_in?
          format.html { redirect_to @order, notice: 'Order was successfully uploaded.' }
          format.json { render :show, status: :ok, location: @order }
        else
          format.html { render :edit }
          format.json { render json: @order.errors, status: :unprocessable_entity }
        end
        if buyer_signed_in?
          format.html { redirect_to @order, notice: 'Order was successfully updated.' }
          format.json { render :show, status: :ok, location: @order }
        else
          format.html { render :edit }
          format.json { render json: @order.errors, status: :unprocessable_entity }
        end
      end
    end
  end

Вот еще одна попытка, которая как-то не сработала:

  def order_cancel
    respond_to do |format|
      if @order.update(order_status)
        format.html { redirect_to @order, notice: 'Order was successfully cancelled.' }
        format.json { head :no_content }
      end
    end
  end

private

def order_status
      params.permit(:order_status)
    end

Как я могу точно указать значения order_status из контроллера, чтобы иметь возможность выполнять отдельные действия и извещения об изменении значений конечным пользователем?

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Итак, эти три строки неверны:

  if @order.update(params[:order_update])
    if user_signed_in?
      if @order.order_status = "cancelled"

Должно быть:

  if user_signed_in?
    if @order.update(status: params[:order_status])
      if @order.order_status == "cancelled"

Но на самом деле должно быть @order.update!(status: :cancelled) в действии cancel или, по крайней мере, иметьконечный автомат для проверки того, что пользователь не портит состояния заказов.

Или, как ожидается в вашей форме, они должны быть в методе update (не cancel_update)

Метод update, который вы опубликовали, не имеет смысла, у него минимум 2 рендера, я думаю, что вы имели в виду отсутствие раздела buyer_signed_in.

0 голосов
/ 17 ноября 2018

Учитывая, что вы используете построитель форм Rails для генерации HTML формы

<%= form_for @order, remote: true do |f| %>
  <%= f.hidden_field :order_status, value: "cancelled" %>

Я ожидаю, что сгенерированное имя поля ввода вложено в order. Тем не менее, при разрешении параметров вам нужно будет следовать следующим условиям:

def order_status
  params.require(:order).permit(:order_status)
end

Если вы не уверены, как на самом деле выглядят параметры, вы можете посмотреть на сгенерированную HTML-структуру формы или посмотреть журналы Rails для запроса update к приложению.

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