Рубиновое метапрограммирование внутри модели - PullRequest
1 голос
/ 04 августа 2011

У меня есть модель под названием Snippet, которая содержит фрагменты HTML для вставки в представления.

Модель имеет столбец CODE и еще один СОДЕРЖАНИЕ

Я хотел бы написать что-то подобное на мой взгляд и вернуть содержимое

<%= raw Snippet.PHONE_NUMBER %> 

, который ищет PHONE_NUMBER в КОДЕ и возвращает CONTENT

Ответы [ 3 ]

1 голос
/ 18 сентября 2011

Более чистый подход (который позволил бы избежать метапрограммирования) позволил бы вашему взгляду сделать что-то вроде этого:

<%= 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
1 голос
/ 04 августа 2011

Добавьте метод класса method_missing в класс Snippet следующим образом

# 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 сломается.В этом подходе много головной боли при обслуживании.

0 голосов
/ 18 сентября 2011

Или используйте делегат.

Но звучит так, как будто вы предоставляете другую реализацию частичек, или помощников, или комбинацию decent_exposure и некоторую комбинацию помощников и частичностей.

...