【问题标题】:Allowing update but preventing a column from being allowed in the update?允许更新但阻止更新中允许列?
【发布时间】:2018-11-17 03:44:21
【问题描述】:

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

问题:有没有办法让我定义我的订单参数但排除特定列?或者甚至将列分成方法?

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 个方法' ?

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

【问题讨论】:

  • But since the original order_params has :orders, the order status is still being included. 你能再解释一下吗?
  • 我实际上想出了一个方法,但我仍然想听听您或其他人要说什么,以防有其他或更好的方法。但是通过拥有:orders,我想这包括所有列,因为即使我删除了“order_status”,它仍然会更新。但是我所做的只是为上面的 order_status 创建一个新方法,将费用放在那里,并从原始更新方法中删除费用......这样它只在订单完成而不是随机更新时收费
  • 你总是可以做类似@order.update_column :order_status, new_value的事情,它只会设置对象的值,更新数据库的值,仅此而已(没有验证,没有回调,什么都没有)。跨度>
  • 就像这样:def xyz - if @order.update(params[:video]) - @order.update_column :order_status, "charged" - end ?? (假设“-”是中断/返回)??这基本上是说,如果上传了视频(这意味着订单已完成),那么将状态更改为收费?
  • 对不起,我想我没有澄清我想要的。我想知道如何从控制器的方法中的列中确定一个值。因此,如果我从视图中更改列值,比如说用按钮,那么控制器会做出反应。因为 order_status 有 3 个不同的值,我希望每个值都有不同的反应

标签: ruby-on-rails ruby


【解决方案1】:

有没有办法让我定义我的订单参数但排除特定的 列?

简单。 #except 方法可用于从(列入白名单的)参数哈希中删除一个或多个键。

order_params.except(:order_status)

或者甚至将列分成方法?

要记住的一点是,ActionController::Parameters 实际上是一个非常基本的哈希对象,您可以根据需要编写白名单函数。

#permit 的工作方式有点像类固醇上的Hash#slice - 它返回一个新的ActionController::Parameters 实例,其中permitted 属性设置为true。它还接受nested parameters 的哈希参数。

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

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

【讨论】:

  • 是的,我想你已经开始了。为每个需要分开的方法简单地创建方法并将完整/原始更新方法定义到特定参数(或只是除了我不想要的那些..)的最佳方法......所以如果我这样做, if 会是这样吗?: if @order.update(order_params).except([:order_status]) ?
  • @order.update( order_params.except(:order_status) )。它需要一个 args 列表 - 而不是一个数组。
  • 至于你在做什么,我会考虑将其设置为POST /orders/:order_id/payments => payment#create。试着从 CRUD'ing restful 资源的角度考虑一个结帐过程。
  • 这基本上就是我设置它的方式,或者可能没有......我有它有订单>>stripe_account ..或者你是说在它自己的控制器中充电......因为如果所以,我不知道如何让它在同一个订单页面中工作......因为订单我需要填写一个表格,我希望收费与订单一起发生,而不需要让他们进入一个全新的页面.. idk 我确信可以完成,但我在编码方面仍然是绿色的
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2019-03-29
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多