gpt4 book ai didi

ruby-on-rails - 从 Rails 3.1 引擎访问模型

转载 作者:行者123 更新时间:2023-12-04 20:53:43 26 4
gpt4 key购买 nike

最后一天我一直在为此苦苦挣扎,这让我发疯了!

作为一个学习练习,我决定将我的一些代码打包到 Rails Gem 中。这段代码有一个 Controller Action 、一个路由、一个模型和一个助手,所以我决定创建 Gem 的最合适方法是将其创建为 Rails 引擎。

一切似乎都运行良好,除了一件事。当我尝试从 Controller 或 View (使用引擎的应用程序)中引用模型时,例如:

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

我收到以下错误:
uninitialized constant Shortener::ShortenerHelper::ShortenedUrl

这很奇怪,因为当我从项目控制台执行代码时不会发生错误。我认为这是因为我已将所有代码放入“Shortener”命名空间/模块中。我这样做是为了避免在其他应用程序中使用时发生冲突。

代码文件层次结构如下所示:

An image of the project directory/file listing

这是有问题的重要文件的类/模块声明代码(删除了胆量)

应用程序/ Controller /缩短器/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

应用程序/模型/缩短器/shortened_urls
module Shortener
class ShortenedUrl < ActiveRecord::Base

# a number of validations, methods etc

end
end

app/helpers/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

lib/shortener/engine.rb
require "rails/engine"
require "shortener"

module Shortener

class ShortenerEngine < Rails::Engine

end

end

lib/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"

缩短器.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 应用程序(查看项目 Controller 的第 18 行):

https://github.com/jpmcgrath/linky

有任何想法吗?我在网上搜索过,但还没有找到任何真正权威的制作引擎 gem 的指南。任何帮助者将不胜感激。

谢谢!

最佳答案

在您的引擎助手 ( app/helpers/shortener/shortener_helper.rb ) 中,替换两次出现的 ShortenedUrlShortener::ShortenedUrl .

一开始我发现这个错误很奇怪,因为 ruby​​ 应该在封闭模块中查找常量。但是助手包含在另一个类中,这可能意味着常量名称解析环境与您在文件中看到的不同。

如果您想了解更多关于命名空间引擎及其行为的信息,可以查看 this excellent answer .

关于ruby-on-rails - 从 Rails 3.1 引擎访问模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7268990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com