Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 两个或多个控制器共享相同的投票操作(只是模型类不同)-如何创建要包含在所有控制器中的mixin?_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

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

Ruby on rails 两个或多个控制器共享相同的投票操作(只是模型类不同)-如何创建要包含在所有控制器中的mixin?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我是rails新手,我正在尝试创建一些通用代码,并跨多个控制器重用它。基本上,我使用的是thumbs_up gem,它允许一些模型充当voteable,而其他模型充当voter(例如,用户模型) 想象一下以下场景: 我有问答模型。这个问题有很多答案。问题和答案都是可吐的 Routes.rb: resources :questions do resources :answers do member do get 'vote_up' get '

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

想象一下以下场景:

我有问答模型。这个问题有很多答案。问题和答案都是可吐的

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
我已经实现了一个解决方案,其中我的每个voteable模型都有自己的控制器,用于处理投票上升和投票下降操作。但是,在两个控制器中,这些操作基本相同,唯一的区别是用于查找要投票的实例的模型类。例如:

提问者:

  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
  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
答复:主办方:

  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
  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
我想用这段代码创建一个mixin,它将包含在两个控制器中,有人能解释一下如何实现它吗?mixin是否应该定义投票方式?或者,mixin是否应该实现一些辅助方法,然后在每个控制器的vote_up和vote_down方法中调用这些辅助方法

这是解决此问题的最佳方法还是应该只有一个控制器来处理向上投票和向下投票操作

我非常感谢你在这些问题上的帮助。 非常感谢


Bruno

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

问题控制员

include Voting
投票模块:

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

你好tommasop,谢谢你的快速回复。我尝试过这种方法,但是我总是会遇到以下错误:NoMethodError(未定义的方法
find'for questions controller:Class):lib/voting.rb:3:in
vote\u up”。我已经包括了对我的问题控制器的投票,并从那里删除了投票方法。更新的答案,你能尝试这种新方法吗?感谢您的提醒-
self.class.to_.chomp('Controller')
比使用
gsub
要快得多。无论何时,只要你需要从一个字符串的末尾咀嚼一组字符,它都是一个更好的选择。谢谢现在我只需要想出一个更好的方法来为voteable模型的成员创建向上投票和向下投票路线。是否可以对routes文件进行一些元编程,以便我们可以使用一行代码注入get'vote_up'和get'vote_down'路由?非常感谢!您也可以只调用字符串上的
.constantize
,而不是
Object.const\u get