Что делает send () в Ruby?



может кто-то пожалуйста, скажите мне, что



send("#{Model.find...}")


это и делает?

597   5  

5 ответов:

send отправляет сообщение экземпляру объекта и его предкам в иерархии классов до тех пор, пока какой-либо метод не отреагирует (поскольку его имя соответствует первому аргументу).

практически говоря, эти линии эквивалентны:

1.send '+', 2
1.+(2)
1 + 2

отметим, что send обходит проверки видимости, так что вы можете вызвать частные методы, тоже (полезно для модульного тестирования).


если действительно нет переменной перед отправкой, это означает, что глобальный объект используется:

send :to_s    # "main"
send :class   # Object

отправить - Это метод ruby (без rails), позволяющий вызывать другой метод по имени.

из документации

   class Klass
     def hello(*args)
       "Hello " + args.join(' ')
     end
   end
   k = Klass.new
   k.send :hello, "gentle", "readers"   #=> "Hello gentle readers"

http://corelib.rubyonrails.org/classes/Object.html#M001077

одна из самых полезных функций я думаю .отправка метод заключается в том, что он может динамически вызвать метод. Это может сэкономить вам много печатать. Одно из самых популярных применений .отправка способ, чтобы динамически назначать атрибуты. Например:

class Car
  attr_accessor :make, :model, :year
end  

чтобы регулярно назначать атрибуты, нужно было бы

c = Car.new
c.make="Honda"
c.model="CRV"
c.year="2014"

или с помощью .отправка метод:

c.send("make=", "Honda")
c.send("model=", "CRV")
c.send("year=","2014")

но все это можно заменить следующим:

предполагая, что ваше приложение Rails должно назначить атрибуты для вашего класса автомобиля из пользовательского ввода, вы можете сделать

c = Car.new()
params.each do |key, value|
  c.send("#{key}=", value)
end

другой пример, похожий на Антонио Джа https://stackoverflow.com/a/26193804/1897857

Если вам нужно прочитать атрибуты на объекте.

например, если у вас есть массив строк, Если вы попытаетесь перебрать их и вызвать их на свой объект, это не сработает.

atts = ['name', 'description']
@project = Project.first
atts.each do |a|
  puts @project.a
end
# => NoMethodError: undefined method `a'
вы можете send строки к объекту:
atts = ['name', 'description']
@project = Project.first
atts.each do |a|
  puts @project.send(a)
end
# => Vandalay Project
# => A very important project

другой вариант использования на вид:

    <%= link_to 
    send("first_part_of_path_{some_dynamic_parameters}_end_path", 
    attr1, attr2), ....
    %>

разрешить . вы пишете масштабируемое представление, которое работает со всеми видами объектов с:

    render 'your_view_path', object: "my_object"

Comments

    Ничего не найдено.