如何为表格中的列中的特定值创建方法?

时间:2018-11-17 05:25:55

标签: ruby-on-rails ruby

问题:我正在寻找一种在表格列中针对不同值单独发出通知的方法。

我的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的'update'操作” (通过删除原始的更新方法对此进行了测试-如下)。

现在,当我使用此更新方法时,它可以工作,但不会仅在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 :(得分:0)

鉴于您使用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结构,或者可以查看update对应用程序请求的Rails日志。

答案 1 :(得分:0)

所以,这三行是错误的:

  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)的{​​{1}}动作,或者至少要有一个状态机来验证用户没有弄乱订单的状态。

或者像您的表单所期望的那样,应该使用cancel方法(而不是update

您发布的cancel_update方法没有意义,它至少具有2个渲染,我想您的意思是没有update部分。