誰か教えてください
send("#{Model.find...}")
とは何ですか?
誰か教えてください
send("#{Model.find...}")
とは何ですか?
回答:
send
いくつかのメソッドが反応するまで(オブジェクトの名前が最初の引数と一致するため)、オブジェクトのインスタンスとそのクラスの祖先にメッセージを送信します。
実際には、これらの行は同等です。
1.send '+', 2
1.+(2)
1 + 2
send
は可視性チェックをバイパスするため、プライベートメソッドを呼び出すこともできます(単体テストに役立ちます)。
送信前に実際に変数がない場合は、グローバルオブジェクトが使用されていることを意味します。
send :to_s # "main"
send :class # Object
sendはruby(railsなし)メソッドで、名前で別のメソッドを呼び出すことができます。
ドキュメントから
class Klass
def hello(*args)
"Hello " + args.join(' ')
end
end
k = Klass.new
k.send :hello, "gentle", "readers" #=> "Hello gentle readers"
.sendメソッドで私が考える最も便利な機能の1つは、メソッドを動的に呼び出すことができることです。これにより、タイピングの手間を省くことができます。.sendメソッドの最も一般的な使用法の1つは、属性を動的に割り当てることです。例えば:
class Car
attr_accessor :make, :model, :year
end
属性を定期的に割り当てるには、
c = Car.new
c.make="Honda"
c.model="CRV"
c.year="2014"
または.sendメソッドを使用:
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
Antonio Jhaの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
define_method
:apidock.com/ruby/Module/define_method。
send
メソッドを呼び出す別の方法です。
これは例によって最もよく示されます:
o = Object.new
o.send(:to_s) # => "#<Object:0x00005614d7a24fa3>"
# is equivalent to:
o.to_s # => "#<Object:0x00005614d7a24fa3>"
このアプローチの利点は、パラメーターとして呼び出すメソッドを渡すことができることです。以下に簡単な例を示します。
def dynamically_call_a_method(name)
o = Object.new
o.send name
end
dynamically_call_a_method(:to_s) # => "#<Object:0x00005614d7a24fa3>"
呼び出したいメソッドを渡すことができます。この場合、を渡しました:to_s
。これはルビメタプログラミングを行うときに非常に便利です。これにより、さまざまな要件に応じてさまざまなメソッドを呼び出すことができるからです。
ビューの別の使用例:
<%= link_to
send("first_part_of_path_#{some_dynamic_parameters}_end_path",
attr1, attr2), ....
%>
許可します。あなたはあらゆる種類のオブジェクトを扱うスケーラブルなビューを書くために:
render 'your_view_path', object: "my_object"