Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在这个rails应用程序中需要全局变量还是更好的OO设计?_Ruby On Rails_Ruby_Variables_Global - Fatal编程技术网

Ruby on rails 在这个rails应用程序中需要全局变量还是更好的OO设计?

Ruby on rails 在这个rails应用程序中需要全局变量还是更好的OO设计?,ruby-on-rails,ruby,variables,global,Ruby On Rails,Ruby,Variables,Global,我正在编写一个rails应用程序,它使用buntine提供的discogs api ruby wrapper,我的大多数对象都需要访问控制器中的@discogs对象,该对象表示整个ruby wrapper和到discogs的连接。我应该在某种程度上使@discogs成为我的应用程序中的全局变量,而不是将@discogs传递给其他对象,这些对象反过来又与其他对象一起工作,而这些对象当然需要将@discogs传递给它们 我觉得我在编写糟糕的代码来传递这个对象,但我也对全局范围解决方案犹豫不决,我甚至

我正在编写一个rails应用程序,它使用buntine提供的discogs api ruby wrapper,我的大多数对象都需要访问控制器中的@discogs对象,该对象表示整个ruby wrapper和到discogs的连接。我应该在某种程度上使@discogs成为我的应用程序中的全局变量,而不是将@discogs传递给其他对象,这些对象反过来又与其他对象一起工作,而这些对象当然需要将@discogs传递给它们

我觉得我在编写糟糕的代码来传递这个对象,但我也对全局范围解决方案犹豫不决,我甚至不确定在rails中实现这一点的合理方法是什么


非常感谢您的建议

您可以在初始值设定项中创建全局对象,而不是在应用程序周围传递
@discogs
变量,如下所示:

config/initializers/discogs.rb

DiscogsWrapper = Discogs::Wrapper.new("My awesome web app")
现在,您可以在应用程序的其他部分中引用
DiscogsWrapper
对象

示例1:

module Artists
  def self.search(name, wrapper = DiscogsWrapper)
    wrapper.search(name)
  end
end
class Artist
  def get
    wrapper.get_artist(discogs_id)
  end

  private

  def wrapper
    DiscogsWrapper
  end
end
示例2:

module Artists
  def self.search(name, wrapper = DiscogsWrapper)
    wrapper.search(name)
  end
end
class Artist
  def get
    wrapper.get_artist(discogs_id)
  end

  private

  def wrapper
    DiscogsWrapper
  end
end
在我看来,这种做法是合理的;我在其他应用程序中也看到过,它工作得很好


希望有帮助。祝你好运

我也不知道标准和正确的答案,但如果您将其作为一种方法,就像我们对
当前用户所做的那样,或者作为应用程序控制器中的一种正常方法,该怎么办?所有控制器都将具有访问权限。