同时提交多个控制器操作的数据,而无需重复逻辑

时间:2015-04-21 15:24:52

标签: ruby-on-rails model-view-controller controller dry

我希望包含来自一个控制器操作的逻辑(提交食谱,厨师可以烹饪),同时还添加额外数据以提交和验证(编辑厨师' s联系信息)。如何在不重复所有逻辑的情况下实现这一目标?

示例控制器/操作:

ChefsController

#recipes_allowed_to_cook

  • 厨师有很长的食谱清单,我们在这里决定他们列表的1-5份食谱,他们可以在我们的餐厅做饭

HiringController

#recipes_and_contact_info

  • 通过CooksController#recipes_allowed_to_cook逻辑编辑/提交食谱 同时还添加/编辑厨师的联系信息
  • 即。提交时,将验证配方和联系信息,但是 食谱将使用相同的代码进行验证 CooksController#recipes_allowed_to_cook

问题是, #recipes_allowed_to_cook 有许多实例变量和两个不同的部分(一个用于:get,另一个用于:post)。我希望能够同时使用此逻辑,因为我还提交了厨师联系信息的数据,因此,如果任一部分有错误,我们会呈现 #recipes_and_contact_info 。< / p>

1 个答案:

答案 0 :(得分:1)

您可以使用服务类:

# 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