两个或多个控制器共享相同的投票操作(只是模型类不同) - 如何创建一个mixin以包含在所有控制器中?

Bru*_*uno 3 ruby-on-rails ruby-on-rails-3

我是rails的新手,我正在尝试创建一些通用代码并在多个控制器中重用它.基本上我使用的是thumbs_up gem,它允许某些模型充当投票者,其他模型充当投票者(例如用户模型).

想象一下以下场景:

我有问答模型.问题有很多答案.问题和答案都是可投票的.

routes.rb中:

resources :questions do

    resources :answers do

      member do
        get 'vote_up'
        get 'vote_down'
      end

    end

    member do
      get 'vote_up'
      get 'vote_down'
    end

  end
Run Code Online (Sandbox Code Playgroud)

我已经实现了一个解决方案,其中我的每个可投票模型都有自己的控制器,其中处理了vote_up和vote_down操作.但是,在两个控制器中,这些操作基本相同,唯一的区别是用于查找要投票的实例的模型类.例:

QuestionsContoller:

  def vote_up
    @voteable = Question.find(params[:id])

    current_user.vote_exclusively_for(@voteable)  

    respond_to do |format|
      format.js { render :action => 'votes/vote_completed' }
    end
  end
Run Code Online (Sandbox Code Playgroud)

AnswersContoller:

  def vote_up
    @voteable = Answer.find(params[:id])

    current_user.vote_exclusively_for(@voteable)  

    respond_to do |format|
      format.js { render :action => 'votes/vote_completed' }
    end
  end
Run Code Online (Sandbox Code Playgroud)

我想用这个代码创建一个mixin包含在两个控制器中,任何人都可以了解如何实现它?mixin应该定义vote_up和vote_down方法吗?或者相反,mixin应该实现一些辅助方法,然后在每个控制器的vote_up和vote_down方法中调用它们?

这是解决此问题的最佳方法,还是应该只有一个控制器来处理vote_up和vote_down操作?

我非常感谢你对这些事情的帮助.提前谢谢了

布鲁诺

tom*_*sop 5

我宁愿采用多态方式,但对于你的mixin(模块),解决方案可以是这样的:

问题控制器

include Voting
Run Code Online (Sandbox Code Playgroud)

投票模块:

module Voting
  def vote_up
    @voteable = Object.const_get(self.class.to_s.chomp('Controller').singularize).find(params[:id])
    current_user.vote_exclusively_for(@voteable)  

    respond_to do |format|
      format.js { render :action => 'votes/vote_completed' }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 只需注意 - "self.class.to_s.chomp('Controller')`比使用`gsub`快一点.当你需要*chmp*字符串末尾的一组字符时,这是一个更好的选择. (4认同)