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