【问题标题】:Failing to call method from ApplicationHelper module in controller无法从控制器中的 ApplicationHelper 模块调用方法
【发布时间】:2015-11-25 07:12:14
【问题描述】:

我正在努力在我的一个控制器中调用一个方法。 当我试图让我的控制器保持瘦身时,我想将一些代码移动到另一个地方。我选择了 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 不是正确的位置,我会将这种方法放在哪里?

【问题讨论】:

    标签: ruby-on-rails-4 controller helper


    【解决方案1】:

    您必须将模块包含在您尝试使用它的控制器类中:

    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
    

    【讨论】:

    • 不应该自动包含它们,还是我在这里混淆了什么?拥有它们的最大优势是什么,我的意思是,如果 Rails 没有包含一些逻辑,使它们比我自己定义的模块特别,为什么还要为我创建它们?
    • ApplicationHelper 中的方法在所有视图中都可用,但如果从控制器类调用这些方法会导致错误。因此,您需要include ApplicationHelper this 才能使用控制器内部的方法。
    • 好的,然后我将视图与控制器混淆了。如果我可以再问一个问题:这样一个在数据库中创建/关联对象但需要在多个控制器中可用的函数属于哪里?
    • 您可以为它们创建一个辅助模块,并将该模块包含在需要提供方法的控制器类中。但是,同样,这是一个设计视角。可能有更好的方法来做这样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    相关资源
    最近更新 更多