我正在审查一个名为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方法),但为什么呢?我非常感谢解释,因为我不熟悉这个主题。谢谢!!
答案 0 :(得分:2)
我将尝试解释,它是如何工作的,但它有点棘手。
fetch_params(key, *subkeys)
方法从key
参数(:conversation或:message)指定的参数中获取一个哈希值,并从中获取subkeys
参数指定的属性的信息:
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
。
现在有点清楚了吗?