我有一个很好的模块 fileprivate protocol TestProtocol {
func testFunc1()
func testFunc2()
}
public class TestClass : TestProtocol {
public func testFunc1() {}
public func testFunc2() {}
}
。在我的文章控制器中,我有一种方法可以通过传入参数的数量来提高用户的声誉。
我决定制作一个gem提供的模块。我已经从我的application_controller.rb文件中删除了该模块,并使其成为自己的gem,推送到github,并捆绑安装它:
Voltaire
当我使用模块中的任何方法时,我得到它之前工作的class ArticlesController < ApplicationController
include Voltaire
def upvote
@article.upvote_by current_user
voltaire_up(1, :reputation, @article.user_id)
redirect_to :back
end
def downvote
@article.downvote_by current_user
voltaire_down(1, :reputation, @article.user_id)
redirect_to :back
end
end
。
我也尝试从控制器中删除undefined method `voltaire_down'
,但这仍然无效。
我错过了什么?
答案 0 :(得分:1)
我能让这个工作的唯一方法是将include Voltaire
放在控制器的顶部。我的印象是rails自动执行此操作,但我在两个独立的应用程序上尝试了gem,这是唯一可行的方法。
修改强>
我设法在一些评论之后让它正常运行。在我的模块所在的gem文件中,我只是包含了这个。现在rails将它包含在控制器中,它可以很好地工作。
if defined? ActionController::Base
ActionController::Base.class_eval do
include Voltaire
end
end