3

在 Ruby 1.9.3p194 中的 Rails 3.2.8 中,当通过respond_to调用 gem 中包含的模块中的方法将数组传递到 ActiveSupport::Concern 的包含块中时,该块会按需包含在类定义中,acts_as_...导致:

respond_to causes undefined method `to_sym' for [:json, :html]:Array

在下一个请求中,我得到:

RuntimeError (In order to use respond_with, first you need to declare the formats your controller responds to in the class level):
  actionpack (3.2.8) lib/action_controller/metal/mime_responds.rb:234:in `respond_with'

在模块代码中,它只是做相当于:

formats = [:json, :html]
respond_to formats

格式在其他地方配置,因此它可以应用于所有指定acts_as_....

我知道当我在类定义中这样做时它会起作用:

respond_to :json, :html

那么,如何使用格式数组的变量调用 respond_to?

4

1 回答 1

3

respond_toRails 3.2.8 中方法的相关部分是:

def respond_to(*mimes)
  # ...
  mimes.each do |mime|
    mime = mime.to_sym
    # ...
  end
  # ...
end

因为 splat 运算符用于respond_to,它将传入的数组包装在一个数组中,所以 mimes 是[[:json, :html]],并且它正在尝试调用to_sym该数组。

respond_to如果使用包含数组的变量调用,则需要使用 splat (*) 运算符,例如:

formats = [:json, :html]
respond_to *formats

这将respond_to像您发送两个参数一样调用:

respond_to :json, :html

或者:

respond_to(:json, :html)
于 2012-10-30T18:05:48.587 回答