目标:每个参数或参数组都有唯一的消息。
我的控制器更新中包含以下代码:
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])
等。
我在这里可以收到自定义消息吗?
答案 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)
# => {}
使用空散列运行update
或update_attributes
将成功。这就是为什么您的第一个if
条件得到满足的原因。作为解决方法,您可以做一些非常简单的事情:
if order_stats.present? && @order.update_attributes(order_status)
Object#present?
方法将检查对象是否为真和非空。与Object#blank?