理解Rails之Array的extract_options!方法

注:原帖地址http://www.simonecarletti.com/blog/2009/09/inside-ruby-on-rails-extract_options-from-arrays/

刚刚在讨论《代码的未来》的翻译, 我也来试试,体验下译者的辛苦,请在评论里纠错我英文很烂

在Rails项目里面是不是经常看到下面的方法调用?

my_method :arg1my_method :arg1, :arg2, :argNmy_method :arg1, :foo => true, :bar => 1

my_method的特别之处在于它可以接受任意数量的参数(:arg1, :arg2…)后跟一个键值对的选项(options)。

ActiveSupport中提供的一个叫做extract_options!的牛逼方法使之成为可能。它的主要作用是提取给出的参数中的选项(options)。如果没有选项(options)它会返回一个空的Hash。

给你们秀一个列子!

# Use args with the splat operation to allow# an unlimited number of parametersdef my_method(*args)  options = args.extract_options!  puts "Arguments:  #{args.inspect}"  puts "Options:    #{options.inspect}"endmy_method(1, 2)# Arguments:  [1, 2]# Options:    {}my_method(1, 2, :a => :b)# Arguments:  [1, 2]# Options:    {:a=>:b}

extract_options!被大量用在Rails项目中,你肯定已经遇见它无数次了。它驱动(powers)了大多数你每天用到的的Rails 功能,包括ActionController filters,ActiveRecord validations 和 finder 方法。

# ActionController filtersclass MyController < ApplicationController  before_filter :my_method, :if => :execute?, :only => %w(new)end# ActiveRecord validations and findersclass MyModel < ActiveRecord::Base  validates_presence_of :field, :allow_blank => true  ...  def self.my_find    find(:all, :order => "id", :limit => 10)  endend

extract_options! 可以让你从一个数组的参数中方便的提取出选项列(a list of options),这通常发生在方法调用时。它不是Ruby的标准方法,但是它是Rails的核心扩展,并且你需要引用 ActiveSupport才能使用。请注意它是一个“bang”方法,因此它会修改调用它的对象。

理解Rails之Array的extract_options!方法

相关文章:

你感兴趣的文章:

标签云: