Lambda作为Ruby中的参数

时间:2012-08-31 15:17:49

标签: ruby ruby-on-rails-3.2

我需要创建一个可以这样调用的方法

list_of_hash_values = MyModel.values_and_links :title, "some_query_param", lambda{|id| url_for :controller => :my_model, :action => :show, :id=> id }

它有3个参数:字段名称(作为符号),查询参数和带有一个参数的lambda。它返回值的哈希值和它们的URL。 Lambda返回一些字符串值(在这种情况下,它是模型实例的ulr)。

我试着这样做:

class MyModel

 def values_and_links(title, query_param, lambda_exp)

   instance_values = MyModel.order(:title).where("#{title} = ?", "%#{query_param}%")
   instance_values.each do |item|
      {:hash_key1 => item.send(title), :hash_key2 => lambda_exp.call(title)} 
   end

 end
end

这是错的,没有工作。

我希望你明白我需要完成的事情。我该怎么做?如何实现方法values_and_links

1 个答案:

答案 0 :(得分:0)

我会改用一个块:

class MyModel
 def values_and_links(title, query_param)
   instance_values = MyModel.order(:title).where("#{title} = ?", "%#{query_param}%")
   instance_values.each do |item|
      {:hash_key1 => item.send(title), :hash_key2 => yield(title)} 
   end
 end
end

然后,您可以像这样调用您的方法:

list_of_hash_values = MyModel.values_and_links :title, "some_query_param" do |id|
  url_for :controller => :my_model, :action => :show, :id=> id
end

或者,对于'短':

list_of_hash_values = MyModel.values_and_links :title, "some_query_param" {|id| url_for :controller => :my_model, :action => :show, :id=> id}