在调用方法之前检查Rails控制器中的对象类型

时间:2015-12-12 06:29:01

标签: ruby-on-rails oop

我想知道是否有更多面向对象的方式来完成我正在做的事情。我的应用程序中的控制器有一个“投票”方法,允许用户对资源进行向上或向下投票。为了使资源获得投票功能,它必须包含两个模块之一:VotableDistrictVotable

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,因此不需要进行类型检查?

1 个答案:

答案 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模块中将忽略分区参数。