Ошибка неопределенного метода для вспомогательного метода при просмотре в движке rails

Я столкнулся со следующей проблемой: в своем приложении я использую движки. Допустим, у меня есть магазинный движок. В этом движке магазина у меня есть два контроллера: carts_controller и products_controller и их помощники: carts_helper и products_helper.

Теперь в моем views/shop/products/index.html.erb представлении я пытаюсь вызвать метод cart_action, который определен в helpers/shop/carts_helper.rb. Однако, к сожалению, я получаю undefined method `cart_action' for #<#<Class:0x007fb3627af090>:0x007fb3627aab08>, когда это делаю. Когда я помещаю тот же метод в helpers/shop/products_helper.rb, я не получаю это сообщение, и метод работает нормально .... Почему я не могу использовать метод из carts_helper, но могу ли я использовать метод из products_helper? В обычном приложении rails я могу использовать любой вспомогательный метод для любого представления, верно?

Возможно, придется что-то делать с пространством имен, т.е. вспомогательные файлы находятся не в helpers, а в helpers/shop, однако это помогает предотвратить конфликты с помощниками из других движков или приложений ...

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

Спасибо за любую помощь заранее!

Примечание. Я не хочу использовать свой вспомогательный метод в основном приложении, а просто в другом представлении того же движка.


person PSR    schedule 19.04.2015    source источник


Ответы (3)


В дополнение к ApplicationHelper для представления доступны только помощники, относящиеся к конкретному представлению. Поскольку это представление, связанное с вашим продуктом, доступны только ApplicationHelper + ProductsHelper. Поэтому решение состоит в том, чтобы переместить этот метод в ProductsHelper или ApplicationHelper.

person MarcusTres    schedule 19.04.2015
comment
Спасибо @MarcusTres, узнал что-то новое сегодня :) Я нашел два других варианта, которые тоже работают для меня, см. мой ответ. - person PSR; 19.04.2015

Я нашел два способа сделать эти методы доступными и для других представлений:

Создав инициализатор в моем /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

Обратите внимание, что в обоих случаях все помощники также будут доступны в основном приложении. Для меня это не проблема (на данный момент).

person PSR    schedule 19.04.2015

Не уверен, что у кого-то здесь такая же проблема, как у меня, но в основном после того, как я создал новый пользовательский помощник, и он не был доступен в представлении, все, что мне нужно было сделать, это перезапустить сервер rails. Я почувствовал себя довольно глупо, осознав это, ну и с облегчением :-)

person KevHo    schedule 25.05.2018