同时为多个控制器操作提交数据,无需重复逻辑
Submit data for multiple controller actions simultaneously without duplicating logic
我想包括来自一个控制器操作的逻辑(提交允许厨师烹饪的食谱),同时还添加额外的数据以提交和验证(编辑厨师的联系信息)。如果不复制所有逻辑,我将如何完成此操作?
示例controllers/actions:
ChefsController
#recipes_allowed_to_cook
- 厨师有一长串食谱,在这里我们从他们的清单中决定 1-5 种允许他们在我们餐厅烹饪的食谱
招聘总监
#recipes_and_contact_info
- Edit/submit 食谱通过 CooksController#recipes_allowed_to_cook 逻辑
同时还有 adding/editing 厨师的联系信息
- 即提交时,食谱和联系信息都将被验证,但是
食谱将使用与以下相同的代码进行验证
CooksController#recipes_allowed_to_cook
问题是,#recipes_allowed_to_cook 有很多实例变量和两个不同的部分(一个用于 :get
,另一个用于 :post
) .我希望能够同时使用此逻辑,因为我还提交了厨师联系信息的数据,因此如果任一部分有错误,我们将呈现 #recipes_and_contact_info。
您可以使用服务 Class:
# lib/controllers_logic/allowed_recipes_computor.rb
class ControllersLogic::AllowedRecipesComputor
attr_reader :chief, :recipes
def initialize(chief)
@chief = chief
end
def execute
@recipes = @chief.recipes.where(some_logic_to_filter_recipes)
self
end
end
然后在您的控制器的操作中:
def recipes_allowed_to_cook
@chief = Chief.find(params[:id])
computor = ControllersLogic::AllowedRecipesComputor.new(@chief).execute
@recipes = computor.recipes
end
我想包括来自一个控制器操作的逻辑(提交允许厨师烹饪的食谱),同时还添加额外的数据以提交和验证(编辑厨师的联系信息)。如果不复制所有逻辑,我将如何完成此操作?
示例controllers/actions:
ChefsController
#recipes_allowed_to_cook
- 厨师有一长串食谱,在这里我们从他们的清单中决定 1-5 种允许他们在我们餐厅烹饪的食谱
招聘总监
#recipes_and_contact_info
- Edit/submit 食谱通过 CooksController#recipes_allowed_to_cook 逻辑 同时还有 adding/editing 厨师的联系信息
- 即提交时,食谱和联系信息都将被验证,但是 食谱将使用与以下相同的代码进行验证 CooksController#recipes_allowed_to_cook
问题是,#recipes_allowed_to_cook 有很多实例变量和两个不同的部分(一个用于 :get
,另一个用于 :post
) .我希望能够同时使用此逻辑,因为我还提交了厨师联系信息的数据,因此如果任一部分有错误,我们将呈现 #recipes_and_contact_info。
您可以使用服务 Class:
# lib/controllers_logic/allowed_recipes_computor.rb
class ControllersLogic::AllowedRecipesComputor
attr_reader :chief, :recipes
def initialize(chief)
@chief = chief
end
def execute
@recipes = @chief.recipes.where(some_logic_to_filter_recipes)
self
end
end
然后在您的控制器的操作中:
def recipes_allowed_to_cook
@chief = Chief.find(params[:id])
computor = ControllersLogic::AllowedRecipesComputor.new(@chief).execute
@recipes = computor.recipes
end