rails类中的gem命名空间

时间:2015-04-10 09:16:25

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

我是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,我认为确保gem需要gemfile中所有gem的方法。

编辑:我愚蠢,事实证明我只需要重置服务器!

1 个答案:

答案 0 :(得分: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()是访问&#34;命名空间&#34;上的类方法的示例。类。

module Foo
  class Bar
    def create
    end
  end
end

你的flickraw示例只是访问嵌套属性(它确实与命名空间有关):

 flickr.photos.getRecent

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

然后,我们会将消息getRecent发送给flickr.photos