Ответ 1
Post.send(anything)
Вот как преобразовать строку в класс в Rails/Ruby:
p = "Post"
Kernel.const_get(p)
eval(p)
p.constantize
Но что, если я извлекаю метод из массива/активного объекта записи, например:
Post.description
но это может быть
Post.anything
где что-то такое строка, как anything = "description"
.
Это полезно, поскольку я хочу реорганизовать очень большой класс и сократить количество строк кода и повторений. Как я могу заставить его работать?
Post.send(anything)
В то время как eval может быть полезным инструментом для такого рода вещей, а те из других фонов могут использовать его так часто, как можно было бы использовать консервный нож, на самом деле это опасно использовать так небрежно. Eval подразумевает, что все может случиться, если вы не будете осторожны.
Более безопасный метод таков:
on_class = "Post"
on_class.constantize.send("method_name")
on_class.constantize.send("method_name", arg1)
Передача объекта # вызовет любой метод, который вы хотите. Вы можете отправить символ или строку и при условии, что метод не является закрытым или защищенным, должен работать.
Так как это задано как вопрос 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"
Попробуйте следующее:
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>)
.