2013-01-08 10 views
5

Próbuję stworzyć problem wewnątrz silnika, aby dodać/zastąpić te funkcje w głównej aplikacji, która zamierza zamontować ten silnik. Problem polega na tym, że miałem problemy, w tym problem w module silnika. Wygląda na to, że Railsy nie mogą go znaleźć.Jak mogę utworzyć problem w silniku Rails?

To jest mój plik post.rb w app/models/blorgh/post.rb:

module Blorgh 
    class Post < ActiveRecord::Base 
    include Blorgh::Concerns::Models::Post 
    end 
end 

A to moja post.rb problemem w lib/concerns/models/post.rb:

require 'active_support/zaniepokojenie'

module Concerns::Models::Post 
    extend ActiveSupport::Concern 

    # 'included do' causes the included code to be evaluated in the 
    # conext where it is included (post.rb), rather than be 
    # executed in the module's context (blorgh/concerns/models/post). 
    included do 
    attr_accessible :author_name, :title, :text 
    attr_accessor :author_name 
    belongs_to :author, class_name: Blorgh.user_class 
    has_many :comments 

    before_save :set_author 

    private 
    def set_author 
     self.author = User.find_or_create_by_name(author_name) 
    end 
    end 

    def summary 
    "#{title}" 
    end 

    module ClassMethods 
    def some_class_method 
     'some class method string' 
    end 
    end 
end 

Kiedy uruchamiam test/Dummy, mam ten błąd: niezainicjowana stała Blorgh :: Obawy

To mój blorgh.gemspec:

$:.push File.expand_path("../lib", __FILE__) 

# Maintain your gem's version: 
require "blorgh/version" 


# Describe your gem and declare its dependencies: 
Gem::Specification.new do |s| 
    s.name  = "blorgh" 
    s.version  = Blorgh::VERSION 
    s.authors  = ["***"] 
    s.email  = ["***"] 
    s.homepage = "***" 
    s.summary  = "Engine test." 
    s.description = "Description of Blorgh." 

    s.files = Dir["{app,config,db,lib}/**/*"] + ["MIT-LICENSE", "Rakefile", "README.rdoc"] 
    s.test_files = Dir["test/**/*"] 

    s.add_dependency "rails", "~> 3.2.8" 
    s.add_dependency "jquery-rails" 

    s.add_development_dependency "sqlite3" 
end 

Czy ktoś może mi pomóc z tym?

Odpowiedz

0

To się dzieje, ponieważ w Rails 3 katalog lib nie jest automatycznie sprawdzany w celu znalezienia klas. Możesz albo zaktualizować config.autoload_paths, aby dodać katalog lib do niego w silniku, albo możesz przenieść obawy/models/post.rb z katalogu lib i do aplikacji/modeli, gdzie zostanie automatycznie znaleziony.

2

Podczas korzystania z silników należy śledzić kolejność ładunków, szczególnie podczas zmiany zachowania głównej aplikacji. Załóżmy, że twój silnik nazywa się "engine_name", powinieneś mieć ten plik: engine_name/lib/engine_name/engine.rb. Jest to jedno miejsce, w którym możesz uwzględnić swoje obawy.

Bundler.require 

module EngineName 
    class Engine < ::Rails::Engine 
    require 'engine_name/path/to/concerns/models/post' 

    initializer 'engine_name.include_concerns' do 
     ActionDispatch::Reloader.to_prepare do 
     Blorgh::Post.send(:include, Concerns::Models::Post) 
     end 
    end 

    # Autoload from lib directory 
    config.autoload_paths << File.expand_path('../../', __FILE__) 

    isolate_namespace EngineName 
    end 
end 

ten sposób upewnić, że wszystko jest ładowany w porządku, ale trzeba być ostrożnym przy użyciu obawy i może rozważyć przy użyciu iniekcji zależność od refactoring Blorgh :: Posta do czynienia z różnymi konfiguracjami.

Powiązane problemy