Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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模型子类的静态属性_Ruby On Rails_Ruby_Sti - Fatal编程技术网

Ruby on rails 声明Rails模型子类的静态属性

Ruby on rails 声明Rails模型子类的静态属性,ruby-on-rails,ruby,sti,Ruby On Rails,Ruby,Sti,我是Ruby和Rails(以及编程!)的新手,我正在尝试找出将属性从模型传递给其STI子级的惯用方法 我有一个通用模型“文档”,以及一些从中继承的模型——让我们以“教程”为例。我有一个“图标”的字符串字段,我想在其中存储图标的文件名,但不是完整的路径(我认为路径应该取决于每个模型,因为它是检索记录数据的细节?) class文档

我是Ruby和Rails(以及编程!)的新手,我正在尝试找出将属性从模型传递给其STI子级的惯用方法

我有一个通用模型“文档”,以及一些从中继承的模型——让我们以“教程”为例。我有一个“图标”的字符串字段,我想在其中存储图标的文件名,但不是完整的路径(我认为路径应该取决于每个模型,因为它是检索记录数据的细节?)

class文档
这是我想对子类做的事情,因此它们会在适当的位置查找它们的“图标”(或任何其他资产)

class Tutorial < Document
  attr_accessible :title, :body, :icon

  @@asset_path = "tutorials/"

  # Other tutorial-only stuff
end
课堂教程

我已经阅读了关于类变量的内容,并且理解了为什么我上面写的内容没有完全按照我的预期工作,但是在教程类中重写“asset_path”的最佳方法是什么?我认为我不应该使用实例变量,因为每个模型实例的值不需要改变。任何值得赞赏的想法(即使这意味着重新思考!)

您只需覆盖
教程
文档
中的
图标
函数(正如它继承的那样),并让它返回正确的路径

这是面向对象编程中的一个典型示例。例如:

class Document
  attr_accessor :title, :body, :icon

  ASSET_DOMAIN = "http://assets.example.com/"

  def icon
    return ASSET_DOMAIN + "documents/" + "document_icon.png"
  end
end

class Tutorial < Document
  def icon
    return ASSET_DOMAIN + "tutorials/" + "tutorial_icon.png"
  end
end

d = Document.new
puts d.icon

i = Tutorial.new
puts i.icon

注意:由于
教程
文档
子类,因此它继承了它的字段和方法。因此,
:title
:body
:icon
不需要在
教程中重新定义,并且可以重新定义
icon
方法以提供所需的输出。在这种情况下,存储一个很少在常量中更改的值也是明智的,
ASSET\u DOMAIN

看起来您正在尝试创建一个常量值,可以重用它来构建路径。我不使用类变量,而是使用常量

现在是安置问题:

课堂上 如果它确实只需要在
文档
和从中继承的类中使用,请在堆栈顶部定义一个常量:

# document.rb
#
class Document < ActiveRecord::Base
  attr_accessible :title, :body, :icon

  ASSET_DOMAIN = "http://assets.example.com/"

end
然后,您可以在任何地方构建链接,而不受类的限制:

# documents.rb
#
icon_path = ASSET_DOMAIN + path_and_file

# tutorial.rb
#
icon_path = ASSET_DOMAIN + path_and_file

# non_document_model.rb
#
icon_path = ASSET_DOMAIN + path_and_file

这可能是一篇社论,但红宝石爱好者在看到
@
时似乎会畏缩。有时间和地点,但对于你想做的事情,我会使用一个常数,并决定你需要将它放在哪里。

你是否计划更改这些值,还是它们真的是常数?这就是我要找的。但我同意jstim的观点——第一个引用了jstim,所以我给出了一些提示,它们更像是常量。感谢链接Dave-是的,我应该为
asset\u域使用一个常量
,现在我对如何声明
asset\u路径
有了一些想法。伟大的谢谢你明确的回答。事实上,资产域的范围确实比我的
文档
更广。这是一个固有的应用程序设置,我应该能够轻松更改,所以在
环境.rb中设置一个常量非常有意义。(假设assets.example.com中断,我需要使用assets.example2.com,我只需在那里更改它并重新部署-很简单!)。感谢您在问题的
asset\u路径
部分给出的答案。我将按照您的建议去做,并覆盖每个子类中的
图标
访问器方法(因为没有太多),但是继续重新实现该方法似乎有点多余?假设我在
assets.example.com
上更改文件夹结构。我必须告诉每个类(而不仅仅是
文档
)如何形成新结构的路径。实际上,我更倾向于使用约定而非配置的方法,即将类名作为路径名。。。
# document.rb
#
class Document < ActiveRecord::Base
  attr_accessible :title, :body, :icon

  ASSET_DOMAIN = "http://assets.example.com/"

end
# environment.rb
#
# other config info
#
ASSET_DOMAIN = "http://assets.example.com/"
# documents.rb
#
icon_path = ASSET_DOMAIN + path_and_file

# tutorial.rb
#
icon_path = ASSET_DOMAIN + path_and_file

# non_document_model.rb
#
icon_path = ASSET_DOMAIN + path_and_file