変数名の一部として使用したい文字列があります。具体的には、Railsルートパスでは次のようになります。
<%= foo_path %>
<%= bar_path %>
ルート名の最初の部分を動的にしたい。だから何かのような
@lol = "foo"
<%= [@lol]_path %> # <-- This would really be the "foo_path" variable
Rubyはこれを行うことができますか?
変数名の一部として使用したい文字列があります。具体的には、Railsルートパスでは次のようになります。
<%= foo_path %>
<%= bar_path %>
ルート名の最初の部分を動的にしたい。だから何かのような
@lol = "foo"
<%= [@lol]_path %> # <-- This would really be the "foo_path" variable
Rubyはこれを行うことができますか?
もちろん:
lol = 'foo'
send "#{lol}_path"
# or
send lol + '_path'
説明:Object#send
メソッドを受信者に送信します(つまり、メソッドを「呼び出し」ます)。他のメソッド呼び出しと同様に、明示的なレシーバー(たとえばsome_object.send 'foo'
)がない場合、現在のコンテキストがレシーバーになるため、呼び出しsend :foo
はと同等self.send :foo
です。実際、Railsはこの手法を舞台裏で非常に多く使用しています(例)。
もっと何か!
class Person
attr_accessor :pet
end
class Pet
def make_noise
"Woof! Woof!"
end
end
var_name = "pet"
p = Person.new
p.pet = Pet.new
(p.send "#{var_name}").make_noise
つまり、ここで何が起こっているのかというと、
p.send "some_method"
呼び出しp.some_method
とかっこで囲まれているため、連鎖が可能になります。つまりp.pet.make_noise
、最後に呼び出しが可能になります。はっきりしているといいのですが。