问题:我正在寻找一种在表格列中针对不同值单独发出通知的方法。
我的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值,以使我能够进行单独的操作并在最终用户更改值时发出通知?
答案 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
部分。