Сделать метод достаточно гибким, чтобы «знать», к какому полю он применяется? - PullRequest
0 голосов
/ 08 февраля 2011

В модели у нас есть такие флаги: :hidden, :phone и :email.

Мне бы хотелось написать метод с именем public_view, который возвращает либо "HIDDEN", ​​либо значение любого поля, к которому он применяется, без необходимости передавать флаг DNC.

Итак, @user.email.public_view возвращает: email, или "HIDDEN", ​​на основе @user.hidden, а @user.phone.public_view возвращает: phone или "HIDDEN", ​​на основе @user.hidden.

Что-то вроде:

def public_view
  self.SOMETHING.hidden ? "HIDDEN" : self.SOMETHINGELSE
end

Я подозреваю, что есть какой-то очень хороший класс / Ruby способ сделать это?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2011

Звучит так, будто вы хотите, чтобы динамический метод обрабатывал аспект public_view ваших полей.

API для него не будет @user.email.public_view, поскольку для этого потребуется public_view, чтобы быть методом класса email. Скорее примерно так:

@user.public_view_email # returns either the value of the #email method
                        # or "HIDDEN", depending on the #hidden attribute

@user.public_view_phone 
# more generally, handle ALL fields in the form: @user.public_view_<field name>

Как это сделать Используйте метод method_missing для обработки методов. Это тот же метод, который используется для динамических методов Active Record find_by_foo. A сообщение в блоге об этом.

Пример, который НЕ проверен:

class User < ActiveRecord::Base
  def method_missing(method, *args)
    if method.to_s =~ /^public_view_(.*)$/
      hidden ? "HIDDEN" : send $1
    else
      super
    end
  end

  # also handle responds_to?
  def respond_to?(method, include_private = false)
    if method.to_s =~ /^public_view_(.*)$/
      true
    else
      super
    end
  end
end
0 голосов
/ 08 февраля 2011

Если тебе не нравится? оператор, вы можете включить это в метод, конечно. Однако я не уверен, что с точки зрения упрощения кода вы получите гораздо больше, чем при использовании каких-либо специальных гемов или других решений.

В этом случае я бы использовал прямой, читабельный и минималистичный подход.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...