【问题标题】:Ruby metaprogramming inside model模型内部的 Ruby 元编程
【发布时间】:2011-08-04 07:32:15
【问题描述】:

我有一个名为 Snippet 的模型,它包含 HTML 的 sn-ps 以推送到视图中。

模型有一个列 CODE 和另一个 CONTENT

我想在我的观点中写这样的东西并把内容拿回来

<%= raw Snippet.PHONE_NUMBER %> 

在 CODE 上查找 PHONE_NUMBER 并返回 CONTENT

【问题讨论】:

    标签: ruby-on-rails ruby metaprogramming


    【解决方案1】:

    Snippet类中添加method_missing类方法如下

    # Snippet class
    class << self 
      def method_missing(method, *args, &block)
        if(snippet = Snippet.find_by_code(method.to_s))
          return snippet.content
        else
          return super(method, *args, &block)
        end
      end
    end
    

    这应该可以解决问题。

    但是,在相关说明中,我不确定这样做是否是最好的方法,因为您的代码依赖于数据库中的数据。明天,电话号码的记录将被删除,您的代码 Snippet.PHONE_NUMBER 将被破坏。这种方法有很多维护难题。

    【讨论】:

    • 谢谢,不错的代码,很好用。感谢您的额外建议,目前我的 CMS 用户只是编辑内容,但当我打开模板时,我需要重新考虑这一点。
    【解决方案2】:

    一种更简洁的方法(可以避免元编程)会让您的视图执行以下操作:

    <%= snippet :PHONE_NUMBER %>
    

    <%= snippet 'PHONE_NUMBER' %>
    

    snippet 方法在这样的辅助模块中定义:

    module SnippetHelper
      def snippet(code)
        raw Snippet.find_by_code(code.to_s).content
      end
    end
    

    并通过以下方式提供给您的所有视图:

    class ApplicationController < ApplicationController::Base
      helper :snippet
    end
    

    【讨论】:

      【解决方案3】:

      或者使用委托。

      但听起来您正在提供另一种部分实现,或助手,或decent_exposure 的组合以及助手和部分的某种组合。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多