Как мне преобразовать строку в метод класса? - PullRequest
38 голосов
/ 26 мая 2010

Вот как преобразовать строку в класс в Rails / Ruby:

p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize

Но что, если я получаю метод из массива / объекта активной записи, например:

Post.description

но это может быть

Post.anything

где что-либо - строка типа anything = "description".

Это полезно, так как я хочу реорганизовать очень большой класс и сократить количество строк кода и повторений. Как я могу заставить это работать?

Ответы [ 4 ]

65 голосов
/ 26 мая 2010
Post.send(anything)
15 голосов
/ 24 мая 2011

Поскольку это вопрос, связанный с Ruby on Rails, я немного уточню.

В Rails 3, если title является именем поля в объекте ActiveRecord, то также допустимо следующее:

@post = Post.new
method = "title"

@post.send(method)                # => @post.title
@post.send("#{method}=","New Name") # => @post.title = "New Name"
15 голосов
/ 26 мая 2010

Хотя eval может быть полезным инструментом для такого рода вещей, и люди из других областей могут использовать его так же часто, как и консервный нож, на самом деле использовать его небрежно. Eval подразумевает, что все может произойти, если вы не будете осторожны.

Более безопасный метод:

on_class = "Post"
on_class.constantize.send("method_name")
on_class.constantize.send("method_name", arg1)

Object # send будет вызывать любой метод, который вы хотите. Вы можете отправить либо Symbol, либо String, и если метод не является частным или защищенным, он должен работать.

0 голосов
/ 26 мая 2010

Попробуйте это:

class Test
 def method_missing(id, *args)
   puts "#{id} - get your method name"
   puts "#{args} - get values"
 end
end

a = Test.new
a.name('123')

Таким образом, общий синтаксис будет a.<anything>(<any argument>).

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