Об этих методах я узнал, когда изучал Ruby, но так и не понял, зачем они существуют и где их можно использовать. Тем не менее, они существуют, и в эти выходные я наконец-то нашел им применение.
Во-первых, что такое Send и Public Send? (Согласно документации send и public send)
Send: Вызывает метод, обозначенный символом, передавая ему все указанные аргументы. Вы можете использовать send, если имя send не совпадает с существующим методом в obj. Если метод идентифицирован строкой, строка преобразуется в символ.
Public Send : Вызывает метод, обозначенный символом, передавая ему все указанные аргументы. В отличие от send, public_send вызывает только публичные методы. Когда метод идентифицируется строкой, строка преобразуется в символ.
Я создавал помощника в rails для форм, чтобы автоматически генерировать теги ввода для определенных полей модели, поэтому я определял массив следующим образом
cols = ["first_name", :user, :first_name, "text"]
Где у нас есть имя тега, модель, поле и тип тега в таком порядке. Этот массив затем отправляется в представление, где теги строятся на основе содержимого массива.
Это было сделано для того, чтобы получить доступ к модели таким образом, чтобы мне не пришлось жестко кодировать ее для конкретных моделей (как в случае с ассоциированными моделями и т.п.). Я использовал публичные посылки следующим образом
cols[1]&.public_send(col[2])
Это вызовет только публичный метод, названный в cols[2] модели, названной в cols[1].
Я не могу придумать другого варианта использования public_send и send, так что если вы ветеран руби, пожалуйста, сообщите мне ниже, использовали ли вы это раньше.