Rails从不同的控制器运行代码

时间:2014-01-28 20:23:44

标签: ruby-on-rails

我在'JobplansController . It creates工作单and任务based on templates called jobplan and jobtask`中有以下代码。

  def copy_to_workorder
  @jobplan = Jobplan.find(params[:id]) # find original jobplan
  wo_attrs =  @jobplan.attributes
  wo_attrs.merge!({jobplan_id: @jobplan.id })
  wo_attrs.delete('woschedule_id')
  workorder = Workorder.create(wo_attrs)

  @jobplan.jobtasks.each do |jobtask|
    jobtask_attrs = jobtask.attributes
    jobtask_attrs.delete('jobplan_id')
    jobtask_attrs.merge!({workorder_id: workorder.id })
    Task.create(jobtask_attrs)
  end

  redirect_to @jobplan, notice: 'Project was successfully created.'
end

使用此按钮可以正常运行:

<%= link_to 'Create Workorder', copy_to_workorder_jobplans_path(:id => @jobplan.id), :class => 'btn btn-success' %>

Jobplanswoschedule有很多关系。 woschedule用于根据workorders安排jobplans的创建。

我正在尝试将代码添加到woschedule控制器。这就是我正在尝试的:

  def run_jobplans
    @woschedule = Woschedule.find(params[:id])
    @woschedule.jobplans.each do |jobplan|
      copy_to_workorder_jobplans_path(jobplan)
    end

    redirect_to @woschedule, notice: 'Jobplans were run successfully.'
  end

我用来运行run_jobplans的按钮是:

<%= link_to 'Run Jobplans', run_jobplans_woschedules_path(:id => @woschedule.id), :class => 'btn btn-success' %>

它正在执行代码,但没有创建新的workorders

感谢您的帮助!

更新!

我将代码移动到了应用程序控制器:

  def jobplan_to_workorder
@jobplan = Jobplan.find(params[:id]) # find original jobplan
wo_attrs =  @jobplan.attributes
wo_attrs.merge!({jobplan_id: @jobplan.id })
wo_attrs.delete('woschedule_id')
workorder = Workorder.create(wo_attrs)

@jobplan.jobtasks.each do |jobtask|
  jobtask_attrs = jobtask.attributes
  jobtask_attrs.delete('jobplan_id')
  jobtask_attrs.merge!({workorder_id: workorder.id })
  Task.create(jobtask_attrs)
end
end

这适用于jobplan控制器 - 我从一个jobplan创建的地方:

但是,如何从:id控制器执行时传递woschedulewoschedule has_many :jobplans

  def run_jobplans
   @woschedule = Woschedule.find(params[:id])
   @woschedule.jobplans.each do |jobplan|
    jobplan_to_workorder(:id => jobplan.id)
   end
   redirect_to @woschedule, notice: 'Jobplans were run successfully.'
  end

2 个答案:

答案 0 :(得分:0)

您应该将您在两个控制器方法中引用的逻辑移动到帮助程序并单独调用它。

答案 1 :(得分:0)

您应该将main方法复制到application_controller并删除一些不常见的代码。

application_controller.rb

def copy_to_workorder_jobplans(parameter)
  ...
end

x_controller.rb

def a
  ...
  copy_to_workorder_jobplans(parameter)
  redirect_to a_path
end

y_controller.rb

def b
  ...
  copy_to_workorder_jobplans(parameter)
  redirect_to b_path
end