如何用不同的参数从两个不同的函数调用同一个函数?

hof1towb  于 2022-09-21  发布在  Ruby
关注(0)|答案(1)|浏览(205)

我试图从两个不同的函数调用相同的函数,而这两个函数又调用另一个函数。以下是问题描述以及一些代码片段-Function-1(从Form-1获得输入)

def create_set_for_class1
   @application.is_xhr_general?

    class_prod = request.GET['class_prod']
    class_corp = request.GET['class_corp']
    run_user = request.GET['run_user']

    begin
     set_generation class_prod, class_corp, run_user
    rescue => error
      return render plain: "Something wrong happened"
    end
    redirect_to :action => 'view'
  end

我有一个类似的函数,但参数不同,这次函数-2(从Form-2输入)-

def create_set_for_class2
     @application.is_xhr_general?

   acc_id = request.GET['acc_id ']

    begin
      set_generation   acc_id
    rescue => error
      return render plain:"Something wrong happened"
    end
    redirect_to :action => 'view'
  end

现在,由上述两个函数调用的函数(函数3)是-

def set_generation class_prod, class_corp, run_user, application: @application

    all_class_prod = Rails.configuration.input1[:prod] + class_prod.split(",").map(&:strip)
    all_class_corp = Rails.configuration.input1[:corp] + class_corp.split(",").map(&:strip)

    foo4 material_set_name_prod, all_class_prod, run_user, application

    foo4 material_set_name_corp, all_class_corp, run_user, application
  end
  • foo4*是正在调用的另一个函数。

正如我们所看到的,函数3(SET_GENERATION)通过获取函数1(CREATE_SET_FOR_CLAS1)和input1的参数来执行操作。现在,我们希望将函数2的参数(CREATE_SET_FOR_A2)包含到函数3中,并通过获取函数2的参数来执行相同的操作,其输入为input2。

如何做到这一点?任何帮助都将不胜感激。**我面临的问题-**在从新创建的函数2调用函数3时,它要求我包含函数1的参数。我们不希望重叠。

erhoui1w

erhoui1w1#

虽然我不知道这应该做什么,或者为什么,但我们可以简化现有的逻辑和代码,如下所示:(希望这能让您有所收获)


# default configurations

def default_config(input:)
  {class_prod: Rails.configuration.public_send(input)[:prod], 
   class_corp: Rails.configuration.public_send(input)[:corp]}
end

# unify repetitive code

def create_set(input:, keys: )
  @application.is_xhr_general?
  config = request.GET.slice(*keys).symbolize_keys
  begin
   set_generation input: input, config: config
  rescue => error
    return render plain: "Something wrong happened"
  end
  redirect_to :action => 'view'
end 

# simplify set_generation

def set_generation(input:, config:, application: @application)
  config[:class_prod] = config.delete(:acc_id) if config.key?(:acc_id) 
  new_config = default_config(input: input).merge(config) {|_,o,n| o + n}

  foo4 material_set_name_prod, new_config[:class_prod], new_config[:run_user], application
  foo4 material_set_name_corp, new_config[:class_corp], new_config[:run_user], application
end

# new method definitions

def create_set_for_class1
  create_set(input: :input1, keys: ['class_prod','class_corp','run_user'])
end 
def create_set_for_class2
  create_set(input: :input2, keys: ['acc_id'])
end

以下是几点注意事项:

1.我不知道@application是什么,但它似乎没有作用(除非它会引发在其他地方处理的错误)。
1.默认application: @application没有任何意义,因为@application似乎始终在范围内。
1.run_usercreate_set_for_class2中没有定义,因此nil将传递给foo4
1.调用foo4两次表示该代码可能也有问题
1.这种逻辑更好地包含在某种对象中,但是有太多的未知因素,我无法提供一个明确的例子。
1.从术语的Angular 来看,Ruby并不重要,但值得注意:Ruby没有函数,只有方法。

相关问题