自定义每个更新参数的通知消息?

时间:2019-02-23 05:54:48

标签: ruby-on-rails ruby

目标:每个参数或参数组都有唯一的消息。

我的控制器更新中包含以下代码:

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 :(得分:1)

@order.order_status_changed?

Rails使用ActiveRecord::Dirty来跟踪更新期间和更新之后对模型的更改。您还可以使用它来查看更改了哪些属性(@order.order_status_changed?(from: :open, to: :cancelled)),最初更改了哪些属性以及更改了哪些属性({{1}})。这样可以更好地控制响应。请注意,在保存订单对象之前,需要实现最后两个示例。

答案 1 :(得分:0)

假设您没有为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)
# => {}

使用空散列运行updateupdate_attributes将成功。这就是为什么您的第一个if条件得到满足的原因。作为解决方法,您可以做一些非常简单的事情:

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

Object#present?方法将检查对象是否为真和非空。与Object#blank?

相反