Разрешить обновление, но запретить использование столбца в обновлении? - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу разрешить обновление, но хочу исключить обновление определенного столбца и создать собственный метод обновления.

Вопрос: Есть ли способ определить мой заказ?параметры, но исключить конкретный столбец?Или даже разделить столбцы на методы?

def order_params
  params.require(:order).permit(:name, :email, :image, :video, :description)
end

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

У меня есть столбец "order_status", который можно изменить с помощью enum 1,2,3, и я хочу, чтобы в нем не происходило обновление, поэтому плата не взимается.

Я создал:

def order_status
  params.permit(:order_status)
end

Но поскольку в оригинальном order_params есть: orders, статус заказа по-прежнему включается.

У меня есть enum as, «создано», «заряжено» и «отменено».Продавец может отменить заказ с помощью:

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

Что я должен сделать, чтобы это обновление "order_status" было выполнено само по себе и вне оригинального метода обновления, чтобы клиенты не получали оплату?

Обновление:

Я нашел способ просто создать свой собственный метод для зарядки и вынуть заряд из метода обновления со всеми параметрами ..

def charge_update
    respond_to do |format|
      @amount = (@order.order_price).to_i * 100
      @amount_seller = (@order.order_price).to_i * 75
      if @order.update(params[:tracking_number])
        if user_signed_in?
                      charge = Stripe::Charge.create({
                        :amount      => (@order.order_price).to_i * 100,
                        :description => 'Rails Stripe customer',
                        :currency    => 'usd',
                        :customer => @order.stripe_customer_token,
                        :destination => {
                          :amount => @amount_seller ,
                          :account => (@order.seller.stripe_token),
                        }
                      })
          @order.order_status = "charged"
          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
      end
    end
  end

Клиент получает плату только после отправки заказа.

Но как я могу указать сам статус параметров?

Например, я хочу создать метод для order_status, но только для случая, когда order_status = "отменен" ... и затем создать еще 2 метода для двух других возможных состояний '?

Так что, когда я / продавец отменяет заказ, я могу создать собственное сообщение,отправлять электронные письма и т. д. и делать то же самое для «заряженных» и «созданных» ....

1 Ответ

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

Можно ли мне определить параметры моего заказа, но исключить конкретный столбец?

Легко.Метод #except можно использовать для удаления ключа или ключей из (белого списка) хэша params.

order_params.except(:order_status)

Или даже разделить столбцы на методы?

Следует помнить, что ActionController::Parameters на самом деле является довольно простым хеш-подобным объектом, и вы можете создавать свои функции белого списка, как вам угодно.

#permit работает примерно так же, как Hash#slice на стероидах - он возвращает новый экземпляр ActionController::Parameters с атрибутом permitted, установленным в значение true.Он также принимает аргумент хэша для вложенных параметров .

Вы также можете использовать массивы для составления белых списков из разных методов.Это может быть довольно изящно, так как все методы в ActionController :: Parameters являются редуктивными.Хитрость заключается в использовании оператора splat (*) для преобразования массива в список аргументов:

def base_parameters
  [:a, :b, :c, :d]
end

def others
  [:e, :f]
end

def create_parameters
  params.require(:order)
        .permit(*base_parameters.concat(others))
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...