2012-06-10 6 views
3

Я пытаюсь получить доступ к помощнику URL из класса модуля. Вот мой код:Доступ к url_helper из класса двигателя

module Station 
    class Plugins 

    @@plugins = [] unless defined?(@@plugins) && @@plugins.class == Array 

    class << self 

     def all 
     return @@plugins.sort_by { |p| p[:weight] } 
     end 

     def register(plugin = {}) 
     raise "plugin must be a Hash (ie.: `register(:foo => 'bar')`)" unless plugin.class == Hash 
     raise "plugin must contain :name (ie.: `register(:name => 'my_plugin')`)" unless plugin[:name].present? 
     plugin[:weight] = 1 unless plugin[:weight].present? 
     plugin[:href] = eval("#{plugin[:name].downcase.pluralize}_url") unless plugin[:href].present? 

     @@plugins.push(plugin) unless @@plugins.include?(plugin) 
     end 
    end 
    # include default plugins: 
    Station::Plugins.register(:name => "Pages", :weight => -1) 
    end 
end 

Когда я запускаю мой сервер, я получил эту ошибку назад:

undefined local variable or method `pages_url' for Station::Plugins:Class 

Я много читал о том, «как назвать URL-адрес помощника из класса», но ни один из решения, которые я нашел, работали на меня.

ответ

7

Во-первых, то, что вы не проясняете, - это то, что помощник URL-адреса, к которому вы пытаетесь получить доступ, относится к родительскому приложению, к которому добавлен движок, или к другому движку, включенному в этот движок.

Если из родительского приложения, то все, что вам нужно:

main_app.pages_url 

Так что вам нужно изменить код соответственно. Обратите внимание, что часть «main_app» - это не имя родительского приложения, а буквально слова «main_app».

Если вы пытаетесь получить доступ к помощнику URL-адреса двигателя, включенного в этот движок, вам необходимо получить к нему доступ, как если бы вы получили доступ к любому движку из родительского приложения. То есть:

Ваш gemspec файл должен включать в себя:

s.add_dependency('my_engine', path: "~/path/to/my_engine") 

routes.rb должна включать в себя:

mount MyEngine::Engine => "/my_engine", as: "any_name_for_my_engine" 

, а затем получить доступ к нему в коде с помощью:

any_name_for_my_engine.pages_url 

Надежда это помогает.

EDIT: Изменить application.rb файл вашего двигателя, чтобы выглядеть, как показано ниже, так что вы можете наследовать все переменные ApplicationController родительского приложения и маршруты:

class Station::ApplicationController < ApplicationController 
end 

Вы можете прочитать Rails Guide on Engines для более подробного объяснения того, как сделать эти работы вместе. Спросите еще раз, есть ли у вас проблемы.

+1

Благодарите свой за ответ. На самом деле, помощник URL, к которому я пытаюсь получить доступ, - это сам модуль. Мой модуль называется «Станция», поэтому я изменил свой код на вызов 'station.pages_url', но у меня есть эта ошибка:' undefined local variable или method 'station 'для Station :: Plugins: Class'. Я также попытался вызвать 'my_app.pages_url', поскольку маршрут, который я хочу вызвать, отображается в' rake routes', но я получил аналогичную ошибку: 'undefined local variable или method' main_app 'для Station :: Plugins: Class'. Нужно ли включать что-то в свой модуль? – AkyRhO

+0

См. Редактирование в моем ответе, чтобы вы могли наследовать маршруты и переменные из ApplicationController родительского приложения. Также убедитесь, что в верхней строке вашего файла route.rb находится «AddressBook :: Engine.routes.draw do». Вам не нужно добавлять «Station» из ваших путей из вашего движка. Это нужно сделать только тогда, когда вы пытаетесь получить доступ к этому пути из родительского приложения. –

0

То, что работало для меня был включить помощник в конкретный класс:

include ENGINE_NAME::Engine.routes.url_helpers 
include Rails.application.routes.url_helpers 
+0

Альтернативно, резервный шаблон, подобный 'Rails.application.routes.url_helpers.try (path_helper_symbol) || ENGINE_NAME :: Engine.routes.url_helpers.try (path_helper_symbol) 'может быть менее загрязняющим. – Epigene