Я хотел немного очистить и реорганизовать код моего метода create внутри моего контроллера заказов, и я прочитал, что это хорошая практика для использования сервисных объектов.Начиная с этого ужасного кода здесь:
def create
if current_user.orders.where(paid: false).present?
order = current_user.orders.last
order_id = order.id
product_id = @product.id
@product.ordinable = false
@product.save
order_amount = order.amount
if order.products << @product
order.products.each do |x|
@order_amountnew = order_amount + x.price
end
order.amount = @order_amountnew
order.save
respond_to do |format|
format.html { redirect_to products_path, notice: 'Product added to the cart!' }
end
else
respond_to do |format|
format.html { redirect_to products_path, notice: 'There was a problem while adding the product to the cart!' }
end
end
else
product_id = @product.id
order = current_user.orders.new
order.save
order_id = order.id
@product.ordinable = false
@product.save
order_amount = order.amount
if order.products << @product
order.products.each do |x|
@order_amountnew = order_amount + x.price
end
order.amount = @order_amountnew
order.save
respond_to do |format|
format.html { redirect_to products_path, notice: 'Product added to the cart!' }
end
OrderPaidCheckJob.set(wait: 3.minutes).perform_later(order_id)
else
respond_to do |format|
format.html { redirect_to products_path, notice: 'There was a problem while adding the product to the cart!' }
end
end
end
end
Я хотел разделить метод в основном на два сегмента, поэтому я создал два модуля в папке служб следующим образом.Я назвал первый order_present_create_service
module OrderPresentCreateService
class << self
def create(params)
order = current_user.orders.last
order_id = order.id
product_id = @product.id
@product.ordinable = false
@product.save
order_amount = order.amount
if order.products << @product
order.products.each do |x|
@order_amountnew = order_amount + x.price
end
order.amount = @order_amountnew
order.save
respond_to do |format|
format.html { redirect_to products_path, notice: 'Product added to the cart!' }
end
else
respond_to do |format|
format.html { redirect_to products_path, notice: 'There was a problem while adding the product to the cart!' }
end
end
end
end
end
и позвонил второму order_new_create_service
module OrderNewCreateService
class << self
def create(params)
product_id = params[:id]
order = current_user.orders.new
order.save
order_id = order.id
@product.ordinable = false
@product.save
order_amount = order.amount
if order.products << @product
order.products.each do |x|
@order_amountnew = order_amount + x.price
end
order.amount = @order_amountnew
order.save
respond_to do |format|
format.html { redirect_to products_path, notice: 'Product added to the cart!' }
end
OrderPaidCheckJob.set(wait: 3.minutes).perform_later(order_id)
else
respond_to do |format|
format.html { redirect_to products_path, notice: 'There was a problem while adding the product to the cart!' }
end
end
end
end
end
здесь мой новый контроллер:
def create
if current_user.orders.where(paid: false).present?
OrderPresentCreateService.create(params)
else
OrderNewCreateService.create(params)
end
end
Я просто следовал этомустатья здесь чтобы все заработало.Когда я пытаюсь создать заказ, теперь я получаю эту ошибку:
неопределенная локальная переменная или метод `current_user 'для OrderNewCreateService: Module
В начале я получаланалогичная ошибка с product_id = @ product.id, поэтому я изменил ее в product_id = params [: id] и заставил работать как-то.Где я делаю это неправильно?