Доступ к модели из Rails 3.1 Engine

94
7

Я боролся с этим в последний день, и это заставило меня NUTS!


В качестве учебного упражнения я решил, что я упакую часть своего кода в Rails Gem. Этот код имеет действие контроллера, маршрут, модель и помощник, поэтому я решил, что наиболее подходящим способом создания Gem будет создание его как Rails Engine.


Кажется, что все работает хорошо, за исключением одного. Когда я пытаюсь ссылаться на модель изнутри контроллера или представлений (приложения, использующего механизм), например:


@su = Shortener::ShortenedUrl.generate("http://stackoverflow.com")

Я получаю следующую ошибку:


uninitialized constant Shortener::ShortenerHelper::ShortenedUrl

Это странно, потому что ошибка не возникает, когда я запускаю код из консоли проектов. Я думаю, что это связано с тем, что я поместил весь код в пространство имен/модуль "Shortener". Я сделал это, чтобы избежать конфликтов при использовании в других приложениях.


Иерархия файла кода выглядит следующим образом:


An image of the project directory/file listing


И вот код декларации класса/модуля (с удалением кишок) важных файлов, о которых идет речь


приложение/контроллеры/Shortener/shortened_urls_controller


module Shortener
class ShortenedUrlsController < ::ApplicationController

# find the real link for the shortened link key and redirect
def translate
# convert the link...
end
end
end


приложение/модели/Shortener/shortened_urls


module Shortener
class ShortenedUrl < ActiveRecord::Base

# a number of validations, methods etc

end
end


приложение/хелперы/Shortener/shortener_helper


module Shortener::ShortenerHelper

# generate a url from either a url string, or a shortened url object
def shortened_url(url_object, user=nil)

# some code to do generate a shortened url

end

end


Библиотека/Shortener/engine.rb


require "rails/engine"
require "shortener"

module Shortener

class ShortenerEngine < Rails::Engine

end

end


Библиотека/shortener.rb


require "active_support/dependencies"

module Shortener

# Our host application root path
# We set this when the engine is initialized
mattr_accessor :app_root

# Yield self on setup for nice config blocks
def self.setup
yield self
end

end

# Require our engine
require "shortener/engine"


shortener.gemspec


require File.expand_path("../lib/shortener/version", __FILE__)

# Provide a simple gemspec so you can easily use your enginex
# project in your rails apps through git.
Gem::Specification.new do |s|
s.name = "shortener"
s.summary = "Shortener makes it easy to create shortened URLs for your rails application."
s.description = "Shortener makes it easy to create shortened URLs for your rails application."
s.files = `git ls-files`.split("\n")
s.version = Shortener::VERSION
s.platform = Gem::Platform::RUBY
s.authors = [ "James P. McGrath" ]
s.email = [ "gems@jamespmcgrath.com" ]
s.homepage = "http://jamespmcgrath.com/projects/shortener"
s.rubyforge_project = "shortener"
s.required_rubygems_version = "> 1.3.6"
s.add_dependency "activesupport" , ">= 3.0.7"
s.add_dependency "rails" , ">= 3.0.7"
s.executables = `git ls-files`.split("\n").map{|f| f =~ /^bin\/(.*)/ ? $1 : nil}.compact
s.require_path = 'lib'
end


Я опубликовал весь код движка на GitHub:


https://github.com/jpmcgrath/shortener


ПРИМЕЧАНИЕ. Этот движок имеет генератор для генерации требуемого файла миграции. Тип:


rails g shortener

Я также создал приложение rails 3.1, которое показывает проблему (посмотрите строку 18 контроллера проектов):


https://github.com/jpmcgrath/linky


Любые идеи? Я просмотрел веб-страницы, но не смог найти настоящего окончательного руководства по созданию Engine Gems. Любые помощники будут очень благодарны.


Спасибо!

спросил(а) 2011-09-01T13:23:00+04:00 8 лет, 10 месяцев назад
1
Решение
78

В вашем помощнике двигателя (app/helpers/shortener/shortener_helper.rb) замените оба вхождения ShortenedUrl на Shortener::ShortenedUrl.


Я нашел эту ошибку странной в начале, потому что Ruby должен искать константы в охватывающем модуле. Но помощники включены в другой класс, что может означать, что постоянная среда разрешения имен отличается от той, которую вы видите в файле.

Если вы хотите узнать больше об машинах с именами и их поведении, вы можете посмотреть отличный ответ.

ответил(а) 2011-09-01T16:21:00+04:00 8 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема