如何处理使用相同控制器,动作和视图的不同类型?

时间:2019-07-15 09:31:18

标签: ruby-on-rails ruby-on-rails-5

我有一个合同模型,它有2种类型 1)税收 2)劳动

我用枚举来存储这两种类型。

有2个菜单,用户可以从中选择税收和劳动合同,并执行所需的任何操作。

这是我的路线文件

scope '/tax' do
        resources :clients, as: :tax_client do
          get 'contract_dashboard', on: :collection
        end
        resources :contracts, except: [:destroy] do
          collection do
            get 'change_contract_dashboard'
            get 'change_contract'
          end
          put 'update_status'
        end
      end
      scope '/labor' do
        resources :clients, as: :labor_client do
          get 'contract_dashboard', on: :collection
        end
        resources :contracts, except: [:destroy] do
          collection do
            get 'change_contract_dashboard'
            get 'change_contract'
            # get 'contract_lists(/:status)' => "contracts#contract_lists",as: :list
          end
          put 'update_status'
        end
      end

现在问题是我在合同中有不同的状态,例如草稿,请求,开始,结束等。视图中有细微的不同。

两者具有相同的控制器,动作和视图。但是路线是不同的,例如税收/合同/新合同,劳工/合同/新合同。我以隐藏形式根据URL传递合同类型的形式。

现在,当我想知道是否收到税收合同或劳动合同的请求时,我必须检查request.url以了解合同的类型。根据我的观点,应该使用任何不同的技术来处理这种系统。

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

继承可以很好地解决您的问题。这就是我要做的:

  1. 创建两个从您的合同模型继承的新类:
# app/models/contracts/tax.rb
class Contracts::Tax < Contract 
  # Tax related code
end

# app/models/contracts/labor.rb
class Contracts::Labor < Contract
  # Labor related code
end
  1. 这使您可以为这些资源建立专用路由:
scope module: :contracts do 
  resources :taxes
  resources :labors 
end
  1. 您还必须拆分控制器
# app/controllers/contracts/taxes_controller.rb
class Contracts::TaxesController < ActionController
  # controller actions for taxes
end

# app/controllers/contracts/labors_controller.rb
class Contracts::LaborsController < ActionController
  # controller actions for labors
end

这似乎是多余的,但可以将关注点清楚地分开。您可以在视图中使用诸如form_for之类的助手,这些助手会将Tax.new和Labor.new实例映射到正确的控制器。由于控制器是分开的,因此您将自动知道它是税种还是人工,因此不再需要检查request.url。

希望有帮助!