Настроить уведомление для каждого параметра при обновлении? - PullRequest
0 голосов
/ 23 февраля 2019

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

У меня есть этот код в моем обновлении контроллера:

def update
    @order = Order.find(params[:id])
    respond_to do |format|
      if @order.update_attributes(order_status)
        # if @order.changed == [:order_status]
          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
    elsif @order.update(order_params)
        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

private

def order_params
      params.require(:order).permit(:name, :name_2, :email, :phone_number)
    end

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

Хотя, независимо от того, какой параметр я обновляю, я всегда получаю сообщение «Заказ был успешно отменен», даже если я вообще не обновляю :order_status.

Я пыталсямного много комбинаций, но я не могу получить уникальное сообщение для работы.Все еще обновляется, только не с сообщениями, которые я хочу.Я пытался не использовать elsif, не определять @order, другие заказы, пользователя .update и .update_attributes, использовать @order.update(params[:order_status]) и т. Д.

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

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019
if @order.update(order_status)
  if @order.order_status_previously_changed?
    format.html { redirect_to @order, notice: 'Order was successfully cancelled.' }
    ...

Rails использует ActiveRecord :: Dirty для отслеживания изменений в модели во время и после обновлений.Вы также можете использовать его, чтобы увидеть, какие атрибуты были изменены (@order.order_status_changed?), кем они были изначально и что они тоже изменили (@order.order_status_changed?(from: :open, to: :cancelled)).Это даст вам более точный контроль над ответом.Обратите внимание, что два последних примера должны быть реализованы до сохранения объекта заказа.

0 голосов
/ 23 февраля 2019

Скажем, вы не указали значение params[:order_status].Тогда метод order_status вернет пустой хеш.Ну, технически это экземпляр ActionController::Parameters, но он ведет себя как хеш:

ActionController::Parameters.superclass
# => ActiveSupport::HashWithIndifferentAccess

ActionController::Parameters.superclass.superclass
# => Hash

params = ActionController::Parameters.new(order: {foo: "bar"})
params.require(:order).permit(:order_status)
# => {}

Выполнение update или update_attributes с пустым хешем будет успешным .Вот почему ваше первое if условие выполняется.В качестве исправления вы можете сделать что-то довольно простое:

if order_stats.present? && @order.update_attributes(order_status)

Метод Object#present? проверит, что объект является достоверным и непустым.Это противоположность Object#blank?

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