rails Engine中视图上的辅助方法的未定义方法错误

时间:2015-04-19 09:39:10

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

我遇到以下问题:在我的应用程序中,我使用引擎。让我们说我有一个商店引擎。在该商店引擎中,我有两个控制器:carts_controller和products_controller及其助手:carts_helper和products_helper。

现在,在views/shop/products/index.html.erb视图中,我尝试调用helpers/shop/carts_helper.rb中定义的方法cart_action。但是,不幸的是,当我这样做时,我得到undefined method `cart_action' for #<#<Class:0x007fb3627af090>:0x007fb3627aab08>。当我在helpers/shop/products_helper.rb中放置相同的方法时,我没有收到此消息,方法也正常....为什么我不能使用carts_helper中的方法,但是我可以使用products_helper中的方法吗?在普通的rails应用程序中,我可以在任何视图上使用任何帮助方法,对吧?

可能必须对命名空间执行某些操作,即帮助程序文件不在helpers但在helpers/shop this helps prevent conflicts with helpers from other engines or apps...

module Shop
  module CartsHelper
      def cart_action(package_id)
        #some code
      end
  end
end

我如何在shop/products/index.html.erb上调用它:

<%= cart_action(package['id']) %>

是否与我从主应用程序继承application_controller的功能这一事实有关?:

class Shop::ApplicationController < ApplicationController
end

而不是

module Shop
  class ApplicationController < ActionController::Base
  end
end

FWIW这个引擎的路线如下:

Shop::Engine.routes.draw do
    resources :products, only: [:index]
    # shopping cart
    resource :cart, only: [:show] do
        put 'add/:package_id', to: 'carts#add', as: :add_to
        put 'remove/:package_id', to: 'carts#remove', as: :remove_from
    end

end

提前感谢您的帮助!

注意:我不想在我的主应用程序中使用我的帮助方法,而只是在同一引擎中的另一个视图中使用。

3 个答案:

答案 0 :(得分:3)

除了ApplicationHelper之外,视图只能访问特定于视图的帮助程序。由于这是与产品相关的视图,因此只能访问ApplicationHelper + ProductsHelper。因此,解决方案是将此方法移至ProductsHelper或ApplicationHelper。

答案 1 :(得分:2)

我发现了两种方法可以将这些方法用于其他视图:

按照此处所述,在我的/my_engine/lib/my_engine/engine.rb文件中创建初始值设定项:https://stackoverflow.com/a/9641149/3519981

或者在我的helper :all文件中加入controllers/myengine/application_controller.rb,如下所述:https://stackoverflow.com/a/1179900/3519981

注意两者都会使主应用程序中的所有帮助程序都可用。对我来说这不是问题(目前)。

答案 2 :(得分:0)

不确定这里是否有人和我有同样的问题,但基本上在我创建了一个新的自定义帮助程序并且在视图中无法访问之后,我所要做的就是重新启动rails服务器。在意识到这一点之后我感到非常愚蠢,并且也松了一口气: - )