【发布时间】:2019-08-14 11:50:01
【问题描述】:
我有一个演示者:
class PresentedOrderService
include Rails.application.routes.url_helpers
attr_reader :service, :order
delegate :date, to: :service
def initialize(service, order)
@service = service
@order = order
end
def order?
service.date == order.delivery_date
end
def confirmation_text
'Click ok to confirm your order.'
end
end
我有一个有条件地显示按钮的视图:
<% if service.order? %>
<div class="badge badge-success">Your order is booked for this date</div>
<% else %>
<%= button_to service.button_text,
arrange_delivery_path(
id: service.order.id,
date: service.date,
),
data: {
confirm: service.confirmation_text
}
%>
<% end %>
作为重构步骤,我想将按钮移动到演示器中:
<% if service.order? %>
<div class="badge badge-success">Your order is booked for this date</div>
<% else %>
<%= service.button %>
<% end %>
class PresentedOrderService
#...
def button
helpers.button_to(
button_text,
arrange_delivery_path(
id: order.id,
date: date,
),
data: { confirm: confirmation_text }
)
end
但是,这不起作用。我在控制台中收到此错误错误:
ActionView::Template::Error (undefined method `protect_against_forgery?' for nil:NilClass):
18: <% if service.order? %>
19: <div class="badge badge-success">Your order is booked for this date</div>
20: <% else %>
21: <%= service.button
22: %>
23: <% end %>
24: </div>
app/controllers/orders_controller.rb:21:in `button'
app/views/orders/edit.html.erb:21
我可以看到问题来自使用button_to 方法,因为当我将代码更改为时看到相同的错误:
def button
helpers.button_to 'Home', Rails.application.routes.url_helpers.root_path
end
当它显示nil:NilClass 时,我不确定该错误指的是什么。这是哪里来的?
我需要采取哪些步骤才能使button_to 在演示者中工作。有可能吗?
更新
这是控制器:
class OrdersController < ApplicationController
def edit
@order = Order.find(params[:id])
@services = ServiceDate.all.map { |service| PresentedOrderService.new(service, @order) }
end
def update
if @order.update(delivery_date: params[:date])
flash[:success] = 'Your delivery has been booked'
redirect_to root_path
else
flash.now[:warning] = 'Error. Please try again or contact support'
render 'edit'
end
end
end
【问题讨论】:
标签: ruby-on-rails ruby