SO的长期读者。我正在使用Rails引擎。大问题是我在生成器的ApplicationHelper中的助手方法上得到NoMethodError。这是为了工作,所以我打算调用引擎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 engine和Rails 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