我想知道是否有更多面向对象的方式来完成我正在做的事情。我的应用程序中的控制器有一个“投票”方法,允许用户对资源进行向上或向下投票。为了使资源获得投票功能,它必须包含两个模块之一:Votable
或DistrictVotable
。
DistrictVotable
模块意味着您需要在投票时指定区域。使用Votable
模块,情况并非如此,您可以在没有地区的情况下进行投票。
所以,这是我的控制器方法的相关部分:
def vote
@resource = find_resource
vote_type = params[:vote_type].to_i
if @resource.is_a? DistrictVotable
@resource.vote(district, vote_type, current_user)
elsif @resource.is_a? Votable
@resource.vote(vote_type, current_user)
end
end
对我而言,控制器在调用@resource
之前需要检查vote
类型似乎不太理想,但我无法弄清楚这一点,因为这决定了{是否{需要传递{1}}。
district
模块将此vote
方法添加到控制器中。也许我需要创建一个单独的VotableController
,因此不需要进行类型检查?
答案 0 :(得分:1)
您可以使投票方法接受任意数量的参数。一种方法是:
在Votable模块中:
def vote(args)
user = args.fetch(:user)
vote_type = args.fetch(:vote_type)
# some logic
end
在DistrictVotable模块中:
def vote(args)
user = args.fetch(:user)
vote_type = args.fetch(:vote_type)
district = args.fetch(:district)
# some logic
end
你用
来称呼它@resource.vote(user: current_user, vote_type: params[:vote_type], district: district)
在Votable模块中将忽略分区参数。