ApplicationHelper没有加载到Rails 4引擎中

时间:2014-10-30 04:23:44

标签: ruby-on-rails ruby-on-rails-4 rails-engines helpers

SO的长期读者。我正在使用Rails引擎。大问题是我在生成器的ApplicationHelper中的助手方法上得到NoM​​ethodError。这是为了工作,所以我打算调用引擎Blorge

我的帮助方法在任何地方都会导致问题。 Helper方法返回NoMethodError。我想也许我需要手动将helper Blorge::ApplicationHelper添加到Blorge :: ApplicationController,但问题仍然存在。

我是否遗漏了一些关于Engines的基本信息?

这是一些实际的代码,可以让您更好地了解我所看到的内容。

index_header partial

app/views/blorge/shared/_index_header.html.erb

# require_locals is the helper method in question here
<% require_locals ['title'], local_assigns %>
<% title = title.pluralize %>

<section class="main_content-header">
  <div class="main_content-header-wrapper">
    <%= content_tag :h1, title %>

    <div class="main_content-header-save">
      <%= link_to "New #{title.singularize}", @new_path, class: "add-button" %>
    </div>
  </div>
</section>

页面#home view

app/views/blorge/pages/home.html.erb

<%= render 'blorge/shared/index_header', title: "Welcome, #{current_user.full_name}" %>

...

引擎应用程序助手

app/helpers/blorge/application_helper.rb

module Blorge
  module ApplicationHelper

    def require_locals(local_array, local_assigns)
      local_array.each do |loc|
        raise "#{loc} is a required local, please define it when you render this partial" unless local_assigns[loc.to_sym].present?
      end
    end

  end
end

引擎页面控制器

app/controller/blorge/pages_controller.rb

module Blorge
  class PagesController < ApplicationController

    def home
    end

  end
end

引擎应用程序控制器

app/controllers/blorge/application_controller.rb

class Blorge::ApplicationController < ActionController::Base
  helper Blorge::ApplicationHelper

  ...
end

如果我重新启动服务器并重新加载页面,它通常会正常工作,一旦工作,问题就不会再回来几天了。阅读Helpers in Rails engineRails Engines: Helpers only are reloaded when restarting the server之后,我觉得我需要在我的to_prepare文件中使用engine.rb方法在我的应用程序控制器中包含帮助程序。我接下来会尝试这个,但我最想知道我是否遗漏了一些非常基本的东西,如果我只需将它添加到engine.rb,有人可以解释原因吗?

这可能是太多的信息,但我宁愿给予更多的信息。提前致谢。


修改

修复程序似乎一直在engine.rb内向应用程序控制器添加帮助程序。我怀疑这将是修复,但我仍然不知道为什么会这样。有谁知道我为什么要这样做?

解决方案

config.to_prepare do
  ApplicationController.helper(MyEngineHelper)
end

0 个答案:

没有答案