【发布时间】:2017-04-10 12:05:06
【问题描述】:
我在下面有这个逻辑。两个控制器的动作内部具有相同的逻辑。 common_logic1 common_logic2 common_logic3,我想分离通用逻辑但不知道该怎么做。
class ServicesController < ApplicationController
...
def download
some_logic_for_services
common_logic1
common_logic2
common_logic3
end
...
end
class PackagesController < ApplicationController
...
def download
some_logic_for_packages
common_logic1
common_logic2
common_logic3
end
...
end
第一种方法是为 ApplicationController 创建方法并继承它。 但我认为这种方式走到了fat applicationController的尽头。
class ApplicationController < ActionController::Base
...
def common_logic
common_logic1
common_logic2
common_logic3
end
...
end
class ServicesController < ApplicationController
...
def download
some_logic_for_services
common_logic
end
...
end
class PackagesController < ApplicationController
...
def download
some_logic_for_packages
common_logic
end
...
end
第二种方法是将逻辑分离到辅助模块并包含它。但我认为 helper 是用于将逻辑与视图分离。
module CommonHelper
...
def common_logic
common_logic1
common_logic2
common_logic3
end
...
end
class ServicesController < ApplicationController
include CommonHelper
...
def download
some_logic_for_services
common_logic
end
...
end
class PackagesController < ApplicationController
include CommonHelper
...
def download
some_logic_for_packages
common_logic
end
...
end
将逻辑分离到 ActiveSupport::Concern 的第三种方式,我认为这种选择在这种情况下是最好的。
module Commonable
extend ActiveSupport::Concern
...
def common_logic
common_logic1
common_logic2
common_logic3
end
...
end
class ServicesController < ApplicationController
include Commonable
...
def download
some_logic_for_services
common_logic
end
...
end
class PackagesController < ApplicationController
include Commonable
...
def download
some_logic_for_packages
common_logic
end
...
end
谁能告诉我这三种方法的优缺点。或者如果有更好的解决方法,请教我。谢谢。
【问题讨论】:
标签: ruby-on-rails