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操作?
我非常感谢你对这些事情的帮助.提前谢谢了
布鲁诺
我宁愿采用多态方式,但对于你的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)
| 归档时间: |
|
| 查看次数: |
994 次 |
| 最近记录: |