Я хотел бы написать что-то вроде поведения в Yii2, поэтому мне нужно не только модуль, но и опции, чтобы определить, как он работает.Параметры модуля в Ruby
Пример того, что мне нужно:
class User
include FullNameModule
show_full_lastname false
...
end
Я видел такой случай в Paperclip самоцвета:
class User < ActiveRecord::Base
attr_accessible :avatar
has_attached_file :avatar, styles: { medium: "300x300>", thumb: "100x100>" }, default_url: "/images/:style/missing.png"
validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/
end
То, что я сейчас:
module FullNameModule
def full_name
if show_full_lastname
"#@name #@last_name"
else
"#@name #{@last_name[0]}."
end
end
def self.included klass
klass.extend ClassMethods
end
def show_full_lastname
self.class.instance_variable_get('@show_full_lastname')
end
module ClassMethods
def show_full_lastname b
@show_full_lastname = b
end
end
end
class User
include FullNameModule
show_full_lastname false
def initialize params
@name = params[:name]
@last_name = params[:last_name]
end
end
user = User.new ({name: 'John', last_name: 'Tailor'})
p user.full_name
Он отлично работает, но выглядит уродливый, какой правильный путь?
Я вижу, о чем вы говорите, но что, если я хочу установить опцию в определении класса, например, в качестве самоцвета Paperclip? Я обновил ответ. – Costa
О «klass.extend ClassMethods» - я прочитал его здесь http://yehudakatz.com/2009/11/12/better-ruby-idioms/ – Costa
Этот параметр настроен, это метод истинный или ложный , Вы можете настроить его в классе, но всегда рекомендуется сохранять код повторно внутри модулей, а не классов. Классы предназначены для объектов, модули для методов. –