Cur*_*ind 5 ruby ruby-on-rails ruby-on-rails-3
Ruby是完全面向对象的语言.在红宝石中,一切都是一个对象,因此属于某个类.例如5属于Object class
1.9.3p194 :001 > 5.class
=> Fixnum
1.9.3p194 :002 > 5.class.superclass
=> Integer
1.9.3p194 :003 > 5.class.superclass.superclass
=> Numeric
1.9.3p194 :005 > 5.class.superclass.superclass.superclass
=> Object
1.9.3p194 :006 > 5.class.superclass.superclass.superclass.superclass
=> BasicObject
1.9.3p194 :007 > 5.class.superclass.superclass.superclass.superclass.superclass
=> nil
Run Code Online (Sandbox Code Playgroud)
所以,我们必须通过在类前面添加类/对象名称来调用所有方法Object_name#method_name.例:
5.times{|i| puts i}
Run Code Online (Sandbox Code Playgroud)
现在,Rails有这些所谓的助手一样stylesheet_link_tag,javascript_include_tag,form_for等它不遵循这个Object_name#method_name语法,所以我想他们只是正常功能.
所以我的问题是
everything a object & there are no primitives.作为例子,人们引用5.+(6)甚至说运营商只是简单的方法?对于没有接收器的其他东西,请查看Kernel模块,其中puts定义了类似的东西.由于该模块包含在内Object,其方法随处可见.究竟是什么与IMHO过度使用相矛盾 - 声称一切都是对象?
这些rails资产标记帮助程序是ActionView的子模块,ActionView::Helpers::AssetTagHelper它提供了生成HTML的方法,可以将视图链接到资源,如图像,javascripts,样式表和feed.
作为modules有class作为超这意味着AssetTagHelpers也会有它
irb(main):016:0> ActionView::Helpers::AssetTagHelper
=> ActionView::Helpers::AssetTagHelper
irb(main):017:0> ActionView::Helpers::AssetTagHelper.class
=> Module
irb(main):018:0> ActionView::Helpers::AssetTagHelper.class.superclass
=> Object
irb(main):019:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass
=> BasicObject
irb(main):020:0> ActionView::Helpers::AssetTagHelper.class.superclass.superclass.superclass
=> nil
Run Code Online (Sandbox Code Playgroud)
注意:为简单起见,我将只关注JavascriptIncludeTag,但它们都非常相似.
在这里你会找到一个名为的课程 ActionView::Helpers::AssetTagHelper::JavascriptIncludeTag
你可以实例化
JavascriptIncludeTag.new(config, asset_paths)
Run Code Online (Sandbox Code Playgroud)
JavascriptIncludeTag类有一个asset_tag调用的content_tag方法,然后调用一个方法并返回正确的标记.
路径:/actionpack/lib/action_view/helpers/asset_tag_helpers/javascript_tag_helpers.rb
require 'action_view/helpers/asset_tag_helpers/asset_include_tag'
# NOTE: on the 'action_view/helpers/asset_tag_helpers/asset_include_tag' it requires '/actionpack/lib/action_view/helpers/tag_helper.rb' so now all this files are connected :)
.
.
.
def asset_tag(source, options)
content_tag("script", "", { "src" => path_to_asset(source) }.merge(options))
end
Run Code Online (Sandbox Code Playgroud)
路径:/actionpack/lib/action_view/helpers/tag_helper.rb
def content_tag(name, content_or_options_with_block = nil, options = nil, escape = true, &block)
if block_given?
options = content_or_options_with_block if content_or_options_with_block.is_a?(Hash)
content_tag_string(name, capture(&block), options, escape)
else
content_tag_string(name, content_or_options_with_block, options, escape)
end
end
Run Code Online (Sandbox Code Playgroud)
这样他们的工作方式就更少了.
注意:如果您发现我的解释有点棘手,请告诉我,我会编辑以提供更好的解释
| 归档时间: |
|
| 查看次数: |
357 次 |
| 最近记录: |