params [key] .instance_eval Ruby解释?

时间:2014-02-18 22:29:52

标签: ruby-on-rails ruby

我正在审查一个名为Mailboxer的Ruby gem,它允许您在Rails应用程序中实现一个简单的私人消息系统。在Github上有一个示例应用程序,我不完全理解。在控制器(click here)中,作者使用以下操作:

  def conversation_params(*keys)
    fetch_params(:conversation, *keys)
  end

  def message_params(*keys)
    fetch_params(:message, *keys)
  end

  def fetch_params(key, *subkeys)
    params[key].instance_eval do
      case subkeys.size
      when 0 then self
      when 1 then self[subkeys.first]
      else subkeys.map{|k| self[k] }
      end
    end
  end

我认为我的第一个问题是fetch_params行动究竟在做什么?我对此进行了一些研究,看起来这是从URL获取id(通过GET方法),但为什么呢?我非常感谢解释,因为我不熟悉这个主题。谢谢!!

1 个答案:

答案 0 :(得分:2)

我将尝试解释,它是如何工作的,但它有点棘手。

fetch_params(key, *subkeys)方法从key参数(:conversation或:message)指定的参数中获取一个哈希值,并从中获取subkeys参数指定的属性的信息:

  • 如果没有传递子密钥,那么它将返回普通参数[key](例如fetch_params(:conversation) == params[:conversation]
  • 如果只传递了一个元素,那么它只会返回它的值(例如fetch_params(:message, :body) == params[:message][:body]
  • 如果传递了多个子密钥,它将返回每个子密钥的值(例如fetch_params(:conversation, :body, :subject) == (params[:conversation][:body], params[:conversation][:subject])

基本上,*在最后一个参数之前告诉ruby将所有相应的属性打包到一个参数中,例如fetch_params(:message, :one, :two, :three) => subkeys == [:one, :two, :three]

然后在数组之前添加*,ruby会将您的数组扩展为多个参数,例如*[:one, :two, :three] == :one, :two, :three

现在有点清楚了吗?