48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
# File 'lib/code-box/code_attribute.rb', line 48
def code_attribute(*code_names)
options = code_names.
opts = DefaultOptions.merge(options)
lookup_type = opts.delete(:lookup_type)
code_attr_suffix = (opts.delete(:code_attribute_suffix) || "code").to_s
foreign_code_attr_name = opts.delete(:foreign_code_attribute)
code_names.each do |code_name|
opts_copy = opts.dup
code_attr_name = (opts_copy.delete(:attribute_name) || "#{code_name}_#{code_attr_suffix}").to_s
code_class_name = opts_copy.delete(:class_name) || "::Codes::#{code_name.to_s.camelize}"
case lookup_type
when :lookup
class_eval " # getter\n def \#{code_name}\n \#{code_class_name}.for_code(\#{code_attr_name})\n end\n\n # setter\n def \#{code_name}=(code)\n value = code.\#{foreign_code_attr_name}\n \#{code_attr_name} = value\n end\n RUBY_\n\n when :associated\n association_options = opts_copy.merge({\n :class_name => \"\#{code_class_name}\",\n :foreign_key => \"\#{code_attr_name}\".to_sym,\n :primary_key => \"\#{foreign_code_attr_name}\"\n })\n belongs_to \"\#{code_name}\".to_sym, association_options\n\n when :i18n\n class_eval <<-RUBY_\n # getter\n def \#{code_name}(locale=I18n.locale)\n code = self.\#{code_attr_name}\n self.class.translate_\#{code_attr_name}(code, :locale => locale)\n end\n\n # setter\n def \#{code_name}=(code)\n raise \"\#{code_name} is a i18n code and can not be set. Use the the correct method '\#{code_attr_name}='' instead.\"\n end\n\n # translator\n class << self\n def translate_\#{code_attr_name}(*code)\n options = code.extract_options!\n locale = options[:locale] || I18n.locale\n codes = code.first\n is_paramter_array = codes.kind_of? Array\n\n codes = Array(codes)\n translated_codes = codes.map { |code|\n code_key = code.nil? ? :null_value : code\n I18n.t(\"\\\#{self._code_box_i18n_model_segment}.values.\\\#{self.name.underscore}.\#{code_attr_name}.\\\#{code_key}\", :locale => locale)\n }\n\n if options[:build] == :zip\n translated_codes.zip(codes)\n else\n is_paramter_array ? translated_codes : translated_codes.first\n end\n end\n end\n RUBY_\n else\n raise ArgumentError, \"'\#{lookup_type}' is not valid. Must be one of [:code_cache, :association]\"\n end\n end\nend\n"
|