- A
- B
- D
- H
- I
- P
- T
- W
常量
APP_PATH | = | File.expand_path("test/dummy/config/application", ENGINE_ROOT) |
实例公共方法
acts_like?(duck) 链接
提供了一种方法来检查某个类是否像其他类一样,基于是否存在一个命名恰当的标记方法。
提供与SomeClass
相同接口的类可以定义一个名为acts_like_some_class?
的标记方法,以向acts_like?(:some_class)
的调用者发出兼容信号。
例如,Active Support 扩展Date
以定义一个acts_like_date?
方法,并扩展Time
以定义acts_like_time?
。因此,开发人员可以调用x.acts_like?(:time)
和x.acts_like?(:date)
来测试鸭子类型兼容性,并且能够像Time
一样工作的类也可以定义一个acts_like_time?
方法来进行互操作。
请注意,标记方法仅期望存在。它不会被调用,因此它的主体或返回值无关紧要。
示例:提供与String
相同接口的类
此类可以定义
class Stringish
def acts_like_string?
end
end
然后客户端代码可以通过以下方式查询鸭子类型安全性
Stringish.new.acts_like?(:string) # => true
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/acts_like.rb, line 33 def acts_like?(duck) case duck when :time respond_to? :acts_like_time? when :date respond_to? :acts_like_date? when :string respond_to? :acts_like_string? else respond_to? :"acts_like_#{duck}?" end end
blank?() 链接
如果对象为 false、空或空白字符串,则该对象为空白。例如,nil
、”、‘ ’、[]、{} 和 false
都是空白的。
这简化了
!address || address.empty?
为
address.blank?
@return [true, false]
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 18 def blank? respond_to?(:empty?) ? !!empty? : false end
deep_dup() 链接
如果对象可复制,则返回对象的深层副本。如果不可复制,则返回self
。
object = Object.new
dup = object.deep_dup
dup.instance_variable_set(:@a, 1)
object.instance_variable_defined?(:@a) # => false
dup.instance_variable_defined?(:@a) # => true
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/deep_dup.rb, line 15 def deep_dup duplicable? ? dup : self end
duplicable?() 链接
你可以安全地复制此对象吗?
对于方法对象为 false;否则为 true。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/duplicable.rb, line 26 def duplicable? true end
html_safe?() 链接
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/string/output_safety.rb, line 7 def html_safe? false end
in?(another_object) 链接
如果此对象包含在参数中,则返回 true。
当参数为Range
时,#cover?
用于正确处理打开范围内的包含检查。否则,参数必须是任何响应#include?
的对象。用法
characters = ["Konata", "Kagami", "Tsukasa"]
"Konata".in?(characters) # => true
对于非Range
参数,如果参数不响应#include?
,这将抛出ArgumentError
。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 15 def in?(another_object) case another_object when Range another_object.cover?(self) else another_object.include?(self) end rescue NoMethodError raise ArgumentError.new("The parameter passed to #in? must respond to #include?") end
instance_values() 链接
返回一个带有字符串键的哈希,将没有“@”的实例变量名称映射到其对应值。
class C
def initialize(x, y)
@x, @y = x, y
end
end
C.new(0, 1).instance_values # => {"x" => 0, "y" => 1}
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 14 def instance_values instance_variables.to_h do |ivar| [ivar[1..-1].freeze, instance_variable_get(ivar)] end end
instance_variable_names() 链接
返回一个实例变量名称的字符串数组,包括“@”。
class C
def initialize(x, y)
@x, @y = x, y
end
end
C.new(0, 1).instance_variable_names # => ["@y", "@x"]
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/instance_variables.rb, line 29 def instance_variable_names instance_variables.map(&:name) end
presence() 链接
如果接收者存在,则返回接收者;否则返回nil
。object.presence
等效于
object.present? ? object : nil
例如,像
state = params[:state] if params[:state].present?
country = params[:country] if params[:country].present?
region = state || country || 'US'
成为
region = params[:state].presence || params[:country].presence || 'US'
@return [Object]
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 45 def presence self if present? end
presence_in(another_object) 链接
如果接收者包含在参数中,则返回接收者;否则返回nil
。参数必须是任何响应#include?
的对象。用法
params[:bucket_type].presence_in %w( project calendar )
如果参数不响应#include?
,这将抛出ArgumentError
。
@return [Object]
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/inclusion.rb, line 34 def presence_in(another_object) in?(another_object) ? self : nil end
present?() 链接
如果对象不为空白,则该对象存在。
@return [true, false]
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/blank.rb, line 25 def present? !blank? end
to_param() 链接
to_s
的别名。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 7 def to_param to_s end
to_query(key) 链接
将对象转换为适合用作 URL 查询字符串的字符串,使用给定的key
作为参数名称。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/to_query.rb, line 13 def to_query(key) "#{CGI.escape(key.to_param)}=#{CGI.escape(to_param.to_s)}" end
try(*args, &block) 链接
调用与public_send
相同方式作为第一个参数传递的公共方法的名称,不同之处在于,如果接收者没有响应它,调用将返回nil
,而不是引发异常。
定义此方法是为了能够编写
@person.try(:name)
代替
@person.name if @person
try
调用可以链接
@person.try(:spouse).try(:name)
代替
@person.spouse.name if @person && @person.spouse
如果接收者没有响应方法,try
也会返回nil
@person.try(:non_existing_method) # => nil
代替
@person.non_existing_method if @person.respond_to?(:non_existing_method) # => nil
无论它是否响应方法,try
在nil
上调用时都返回nil
nil.try(:to_i) # => nil, rather than 0
如果调用时,参数和块将被转发到方法
@posts.try(:each_slice, 2) do |a, b|
...
end
签名中的参数数量必须匹配。如果对象响应该方法,则尝试调用,如果参数不匹配,则仍然会引发ArgumentError
。
如果try
在没有参数的情况下被调用,它会将接收者传递给给定的块,除非它为nil
@person.try do |p|
...
end
你也可以在不接受参数的情况下用块调用 try,块将被实例_eval’ed
@person.try { upcase.truncate(50) }
另请注意,try
是在Object
上定义的。因此,它不适用于没有Object
作为其祖先的类的实例,例如BasicObject
的直接子类。
来源:在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/try.rb, line 39
try!(*args, &block) 链接
与try
相同,但如果接收者不为nil
且未实现尝试的方法,则会引发NoMethodError
异常。
"a".try!(:upcase) # => "A"
nil.try!(:upcase) # => nil
123.try!(:upcase) # => NoMethodError: undefined method `upcase' for 123:Integer
来源:在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/try.rb, line 104
with(**attributes) 链接
在块周围设置和还原公共属性。
client.timeout # => 5
client.with(timeout: 1) do |c|
c.timeout # => 1
end
client.timeout # => 5
接收者被传递到提供的块中。
此方法是常见 begin/ensure 模式的简写
old_value = object.attribute
begin
object.attribute = new_value
# do things
ensure
object.attribute = old_value
end
只要读取器和写入器方法都是公共的,它就可以用在任何对象上。
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/with.rb, line 26 def with(**attributes) old_values = {} begin attributes.each do |key, value| old_values[key] = public_send(key) public_send("#{key}=", value) end yield self ensure old_values.each do |key, old_value| public_send("#{key}=", old_value) end end end
with_options(options, &block) 链接
一种优雅的方式来将传递给一系列方法调用的选项中的重复部分分解出来。在块中调用的每个方法(以块变量作为接收器),其选项将与提供的默认 options
Hash
或类似 Hash
的对象合并。在块变量上调用的每个方法都必须以选项哈希作为其最后一个参数。
如果没有 with_options
,这段代码包含重复部分
class Account < ActiveRecord::Base
has_many :customers, dependent: :destroy
has_many :products, dependent: :destroy
has_many :invoices, dependent: :destroy
has_many :expenses, dependent: :destroy
end
使用 with_options
,我们可以消除重复部分
class Account < ActiveRecord::Base
with_options dependent: :destroy do |assoc|
assoc.has_many :customers
assoc.has_many :products
assoc.has_many :invoices
assoc.has_many :expenses
end
end
它也可以与显式接收器一起使用
I18n.with_options locale: user.locale, scope: 'newsletter' do |i18n|
subject i18n.t :subject
body i18n.t :body, user_name: user.name
end
当您不传递显式接收器时,它将在合并选项的上下文中执行整个块
class Account < ActiveRecord::Base
with_options dependent: :destroy do
has_many :customers
has_many :products
has_many :invoices
has_many :expenses
end
end
with_options
也可以嵌套,因为调用被转发到其接收器。
注意:每个嵌套级别除了自己的默认值外,还会合并继承的默认值。
class Post < ActiveRecord::Base
with_options if: :persisted?, length: { minimum: 50 } do
validates :content, if: -> { content.present? }
end
end
代码等效于
validates :content, length: { minimum: 50 }, if: -> { content.present? }
因此,if
键的继承默认值被忽略。
注意:您不能在 with_options
中隐式调用类方法。您可以使用类名来访问这些方法
class Phone < ActiveRecord::Base
enum :phone_number_type, { home: 0, office: 1, mobile: 2 }
with_options presence: true do
validates :phone_number_type, inclusion: { in: Phone.phone_number_types.keys }
end
end
当省略块参数时,将返回装饰过的 Object
实例
module MyStyledHelpers
def styled
with_options style: "color: red;"
end
end
styled.link_to "I'm red", "/"
# => <a href="/" style="color: red;">I'm red</a>
styled.button_tag "I'm red too!"
# => <button style="color: red;">I'm red too!</button>
来源:显示 | 在 GitHub 上
# File activesupport/lib/active_support/core_ext/object/with_options.rb, line 92 def with_options(options, &block) option_merger = ActiveSupport::OptionMerger.new(self, options) if block block.arity.zero? ? option_merger.instance_eval(&block) : block.call(option_merger) else option_merger end end