ruby – 元编程:输出方法正文为文本

我在模块中动态定义一个方法,我想检查一旦方法绑定到一个类实例,该方法的正文是我期待的.有没有办法输出(作为文本)的方法的正文?

模块controller_mixins.rb:

module ControllerMixin

  instance_eval "def search_by_vendor (*args) \n" \
    " @#{self.class.name.sub(/Controller/,'').tableize} = #{self.class.name.sub(/Controller/,'')}.find_all_by_vendor_id(params[:vendor_id])  \n"\
    "respond_to do |format| \n" \
    " format.html { render :template=>'/#{self.class.name.sub(/Controller/,'').tableize}/index',:layout=>'vendor_info'} \n" \
    " format.xml  { render :xml => @#{self.class.name.sub(/Controller/,'').tableize} } \n" \
    "end \n"\
  "end \n"

end

课堂混合:

class vendorOrdersController < ApplicationController
  # GET /vendor_orders
  # GET /vendor_orders.xml
  require 'controller_mixins'
  include ControllerMixin
 <rest of class>

所以我想在应用于vendorOrdersController时看到mixin的实现
可能通过脚本/控制台方便.

更新:Per @〜/我将字符串保存到一个变量中并将其放在一起.这样很好.这引起了我的代码中的错误(原因我想首先看到代码).下面的代码好多了,按预期工作.

module ControllerMixin

  def self.included(mod)
     method_body = "def search_by_vendor \n" \
      " @#{mod.name.sub(/Controller/,'').tableize} = #{mod.name.sub(/Controller/,'')}.find_all_by_vendor_id(params[:vendor_id])  \n"\
      "respond_to do |format| \n" \
      " format.html { render :template=>'/#{mod.name.sub(/Controller/,:layout=>'vendor_info'} \n" \
      " format.xml  { render :xml => @#{mod.name.sub(/Controller/,'').tableize} } \n" \
      "end \n"\
    "end \n" 

    puts method_body
    mod.class_eval(method_body)
  end

end

解决方法

不,你不能得到一个方法的源代码.

最好的方法是使用Object#方法获取表示方法的Method对象.例如:

m = vendorOrdersController.method(:search_by_vendor)

但是你会发现方法#名称,方法#arity,方法#source_location等没有什么.

在你的情况下,为什么不使用instance_eval将字符串存储在一个变量中,打印呢?

无论如何,您的instance_eval将在模块声明时执行.您可能希望将其包含在包含的回调中,以便在包含的时候执行它.

module ControllerMixin
  def self.included(mod)
    mod.instance_eval([...])
  end
end

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...