当方法名称是动态的时,如何在Ruby中调用方法?

时间:2013-05-25 13:18:49

标签: ruby

@video = Video.new
thumb = "video_thumbnail"
@video_thumbnail = @video.video_thumbnail  ## works fine 
@video_thumbnail = @video.thumb            ## undefined method `thumb'

如何动态调用video_thumbnail方法?

2 个答案:

答案 0 :(得分:6)

在Ruby中,您可以使用与此类似的send

thumb = :video_thumbnail
@video_thumbnail = @video.send(thumb)

但是,您应该了解此方法可能带来的安全隐患。如果thumb变量的内容以任何方式由用户控制(例如,通过从params设置),则任何用户都可以在您的视频对象上调用任意方法。考虑到Rails中的大量元编程,您可以轻松地以这种方式调用和运行任意代码。因此,您应该确保严格控制thumb变量的内容。

如果可能,您应该使用其他方法来调用方法,例如通过使用单独的控制器操作和适当的路由来调用它们。

答案 1 :(得分:2)

您有send()动态调用方法(如果对象可能覆盖了__send__,则send

http://ruby-doc.org/core-2.0/Object.html#method-i-send