无法从控制器中的 ApplicationHelper 模块调用方法
Failing to call method from ApplicationHelper module in controller
我很难在我的一个控制器中调用方法。
当我试图让我的控制器保持苗条时,我想将一些代码移动到另一个地方。我选择了 ApplicationHelper,因为代码显然不属于我的模型之一。
这是我的 ApplicationHelper:
module ApplicationHelper
def add_tag_to_vocab(vocab, tag)
user = User.find(vocab.user_id)
tag_handler = user.tags.where(name: tag).first
if tag_handler.nil?
tag_handler = user.tags.create(name: tag, active: true)
vocab.tags << tag_handler
else
vocab.tags << tag_handler
end
end
end
现在我想在控制器中使用这个方法。我这样尝试:
def import_vocabs
....
add_tag_to_vocab(new_vocab, @wordsearch.keyword)
...
...
respond_to do |format|
format.js { render file: "wordsearches/wordsearch_finish.js.erb"}
end
end
我明白了:
NoMethodError (undefined method `add_tag_to_vocab' for #<WordsearchesController:0x007f86d18cec40>):
我的问题是:
我如何从 ApplicationHelper 调用此方法,它不应该自动可用吗?
我试图在 Rails Guides Controller Page 中找到答案,但我没有。
取决于答案:
如果 ApplicationHelper 不是正确的地方,我应该把这样的方法放在哪里?
您必须将模块包含在控制器中 class 从您尝试使用它的地方:
include ApplicationHelper
所以,它应该是这样的:
class YourClassName
include ApplicationHelper
def import_vocabs
add_tag_to_vocab(new_vocab, @wordsearch.keyword)
respond_to do |format|
format.js { render file: "wordsearches/wordsearch_finish.js.erb"}
end
end
end
我很难在我的一个控制器中调用方法。 当我试图让我的控制器保持苗条时,我想将一些代码移动到另一个地方。我选择了 ApplicationHelper,因为代码显然不属于我的模型之一。
这是我的 ApplicationHelper:
module ApplicationHelper
def add_tag_to_vocab(vocab, tag)
user = User.find(vocab.user_id)
tag_handler = user.tags.where(name: tag).first
if tag_handler.nil?
tag_handler = user.tags.create(name: tag, active: true)
vocab.tags << tag_handler
else
vocab.tags << tag_handler
end
end
end
现在我想在控制器中使用这个方法。我这样尝试:
def import_vocabs
....
add_tag_to_vocab(new_vocab, @wordsearch.keyword)
...
...
respond_to do |format|
format.js { render file: "wordsearches/wordsearch_finish.js.erb"}
end
end
我明白了:
NoMethodError (undefined method `add_tag_to_vocab' for #<WordsearchesController:0x007f86d18cec40>):
我的问题是: 我如何从 ApplicationHelper 调用此方法,它不应该自动可用吗? 我试图在 Rails Guides Controller Page 中找到答案,但我没有。
取决于答案: 如果 ApplicationHelper 不是正确的地方,我应该把这样的方法放在哪里?
您必须将模块包含在控制器中 class 从您尝试使用它的地方:
include ApplicationHelper
所以,它应该是这样的:
class YourClassName
include ApplicationHelper
def import_vocabs
add_tag_to_vocab(new_vocab, @wordsearch.keyword)
respond_to do |format|
format.js { render file: "wordsearches/wordsearch_finish.js.erb"}
end
end
end