【问题标题】:gem namespaces within rails classrails 类中的 gem 命名空间
【发布时间】:2015-06-15 22:47:59
【问题描述】:

我是 Rails(和 ruby​​)的新手,在访问不同的命名空间时遇到了很多麻烦。具体来说,我无法从控制器类中访问 flickraw gem 的命名空间:

class ImageSourcesController < ApplicationController
    def show
        list   = flickr.photos.getRecent
        ...
    end
end

调用这个方法,得到响应:

undefined local variable or method `flickr' for #<ImageSourcesController:0x00000005006658>

我正在使用 bundler,我认为它确保了 gemfile 中所有 gem 的方法都是 rails 需要的。

编辑:我很愚蠢,原来我只需要重置服务器!

【问题讨论】:

  • 我确实看到了那个例子,但是当我需要'flickraw'时,我得到了错误:“无法加载这样的文件——flickraw”我认为捆绑器是为了让所有的宝石都可以访问?即不需要不需要?
  • 您是否尝试关注original documentation
  • 你是对的@user1618840,rails 会自动为你需要所有的 gems 文件,但是我很好奇你是否尝试过那个教程,因为我没有使用那个 gem。我在 Rails 4.1.10 和 ruby​​ 2.2.1 中创建了一个测试应用程序,一切正常。你在 Gemfile 中包含 gem 对吗?
  • @radubogdan 是的,肯定包含了 gem,并检查了它是否安装了 bundle show

标签: ruby-on-rails ruby ruby-on-rails-3 bundler


【解决方案1】:

为 flickraw 创建一个初始化程序是个好主意:

# config/initializers/flickraw.rb
FlickRaw.api_key= ENV['FLICKR_API_KEY']
FlickRaw.shared_secret= ENV['FLICKR_API_SECRET']

如果您正在创建一个开源应用程序,您可能希望使用 ENV 变量来存储您的 API 密钥和共享密钥。 dotenv gem 是一个非常好的工具。

您似乎也对 Ruby 中的命名空间感到困惑。 Ruby 实际上并没有命名空间,例如 PHP,它有一个特殊的关键字和命名空间访问器。

Ruby 的模块既充当命名空间(分组类、常量等)又充当特征。 Foo::Bar.create() 是访问“命名空间”类上的类方法的示例。

module Foo
  class Bar
    def create
    end
  end
end

您的 flickraw 示例只是访问嵌套属性(实际上与命名空间没有任何关系):

 flickr.photos.getRecent

您获取对象 flickr(当我们需要 flickraw 时由 flickraw 创建)并向其发送消息 photos,该消息返回一个 FlickRaw::Flickr::Photos 实例。

然后我们将消息getRecent 发送到flickr.photos

【讨论】:

  • 很公平,我想我的问题是为什么 flickraw 没有为我的应用创建 flickr 对象?
  • 确保config/application.rb 包含Bundler.require(*Rails.groups) 行。检查您是否有机会在 gemfile 中将 flickraw 添加到诸如 group :test 之类的组中。
  • 还要确保重新启动 Rails 服务器 - 它可能不会在安装的新 gem 上启动。
  • 哈哈,重启服务器就搞定了。感谢您的帮助
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2016-09-11
  • 2018-08-09
  • 2016-06-17
  • 2019-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多