假设我有一个产品模型和 ProductsController。控制器具有所有标准的 CRUD 方法,产品进行各种验证等。
这是一个问题。我有几个自定义的非常复杂的操作,它们也需要以多种格式(json、html、xml、csv、pdf 等)响应。造成这种情况的业务逻辑原因超出了问题的范围。让我们就这样吧,这是它必须完成的方式。我也使用 InheritedResources gem,但我认为这对这个问题并不重要。
例如(这是一个模拟应用程序,非常简化 - 我删除了各种 if else 语句、循环和本地化等):
class ProductController < InheritedResources::Base
....
def check_stock_using_legacy_identifier_and_create_a_unique_po_number_and_place_an_order
@order = Order.new
@product = Product.find(params[:legacy_alphanumeric_product_number])
if @product.stock > 5
@po = LegacyOrder.create_po
if @po
if @order.save
format.html{ render :check_stock_using_legacy_identifier_and_create_a_unique_po_number_and_place_an_order, flash: {success: "Wow! Input was good!"}}
format.json{ render status: 400, json: {status: :success, message: "Order created"}}
else
format.html{ render :check_stock_using_legacy_identifier_and_create_a_unique_po_number_and_place_an_order, flash: {error: "Can't create order, some validations failed"}}
format.json{ render status: 400, json: {status: :error, message: "Problem with order", errors: @order.errors}}
end
else
format.html{ render :check_stock_using_legacy_identifier_and_create_a_unique_po_number_and_place_an_order, flash: {error: "Can't create order, PO number wasn't generated"}}
format.json{ render status: 400, json: {status: :error, message: "Problem with po", errors: @po.errors}}
end
else
respond_to do |format|
format.html{ render :check_stock_using_legacy_identifier_and_create_a_unique_po_number_and_place_an_order, flash: {error: "Can't create order, stock is low"}}
format.json{ render status: 400, json: {status: :error, message: "Problem with product", errors: @product.errors}}
end
end
end
....
end
这只是为了说明某些操作的复杂性。
现在的问题是:所有这些优点都应该转移到模型中吗?我正在处理应该在控制器中的业务逻辑,但是在尝试遵循胖模型和瘦控制器的经验法则时,在我看来它应该被移走,如果是这样,那么还有什么需要移动?
奖励问: 我遇到了可能需要在代码中使用某些功能的用例,而不是通过 REST 接口。IE 我需要在运行 rake 任务时使用 check_stock_using_legacy_identifier_and_create_a_unique_po_number_and_place_an_order。就像根据低库存或电子邮件事件等生成一些订单。虽然我可以使用此处描述的选项:如何从 Rails 的控制台调用控制器/视图方法?,将这个动作作为模型的一部分会更容易,不是吗?
那么在这种情况下,Rails 最佳实践的行动方案是什么?