在Rails 3.2.13中使用splat令牌和委托的替代方法(Ruby 1.8.7)

时间:2013-06-19 22:08:21

标签: ruby-on-rails ruby ruby-1.8.7

快速提问:我想在我的模型中delegate一组关联方法:

z13u_methods = [
  :isbn_cleaned,
  :oclc_cleaned,
  :contents_cleaned, 
  :summary_cleaned,
  :title_statement,
  :is_serial?
]

delegate *z13u_methods, :to => :z13u, :prefix => true, :allow_nil => true

当我在Ruby 1.9.3上运行Rails 3.2.13时,这很好用。但是,当我在Ruby 1.8.7上运行Rails 3.2.13(相同版本)时,遇到以下错误:

syntax error, unexpected tSYMBEG, expecting tAMPER
  delegate *z13u_methods, :to => :z13u, :prefix => true, ...

突出显示:to

我想在Ruby 1.8中,splatted数组必须是最终参数(块名称除外)。是否有其他方法可以为这种情况绘制数组?

1 个答案:

答案 0 :(得分:2)

如果您只使用z13u_methods进行delegate来电,那么您可以这样做:

delegate_args = [
  :isbn_cleaned,
  :oclc_cleaned,
  :contents_cleaned, 
  :summary_cleaned,
  :title_statement,
  :is_serial?,
  { :to => :z13u, :prefix => true, :allow_nil => true }
]
delegate *delegate_args

我认为这是你需要的基本模式。当然还有其他方法可以实现:

delegate *(z13u_methods + [{ :to => :z13u, :prefix => true, :allow_nil => true }])

# If you don't mind changing z13u_methods
delegate *z13u_methods.push(:to => :z13u, :prefix => true, :allow_nil => true)

# If you don't want to change z13u_methods
delegate *z13u_methods.dup.push(:to => :z13u, :prefix => true, :allow_nil => true)
# ---------------------^^^

这个主题可能有更多变化,这些只是想到的两个选项。

就使用1.8.7而言,尽快升级,我认为1.8.7甚至不再支持。