允许更新但阻止在更新中允许使用列吗?

时间:2018-11-16 17:44:49

标签: ruby-on-rails ruby

我想允许更新,但想排除特定列的更新并创建它自己的更新方法。

问题:我是否可以定义订单参数但排除特定列?甚至将这些列分成方法?

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

我的问题是,我在更新方法中收取条纹费用,因此当我简单地更新订单“ order_status”时,客户就会被收取费用。

我有一列“ order_status”,可以通过枚举1,2,3进行更改,并且我想避免在其中进行更新,因此不收取费用。

我创建了:

def order_status
  params.permit(:order_status)
end

但是由于原始的order_params具有:orders,所以订单状态仍被包括在内。

我的枚举为“创建”,“收费”和“取消”。卖方可以通过以下方式取消订单:

<%= 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 =“ cancelled” ...时,然后再为其他2个可能的状态创建2个方法' ?

因此,当我/卖方取消订单时,我可以创建自定义消息,发送电子邮件等,并对“已收费”和“已创建”执行相同的操作。...

1 个答案:

答案 0 :(得分:0)

  

我是否可以定义订单参数,但排除特定参数   专栏?

容易。 Antoinette Abbate 84 Adaline Aker 99 Alyce Arvin 72 Amos Amerine 90 Anneliese Atnip 73 Almeda Austria 86 方法可用于从(列入白名单的)参数哈希中删除一个或多个键。

#except
  

或者甚至将列分成方法?

要记住的一件事是ActionController::Parameters实际上是一个非常基本的哈希,类似于object,您可以根据需要编写白名单函数。

order_params.except(:order_status) 在类固醇上的工作原理类似于Hash#slice-它返回一个新的#permit实例,其ActionController::Parameters属性设置为true。它还为nested parameters采用了哈希参数。

您还可以使用数组来组合来自不同方法的白名单。因为ActionController :: Parameters中的所有方法都是可归约的,所以这可能非常漂亮。诀窍是使用the splat(*) operator将数组转换为参数列表:

permitted