" 花子" end end User.new(name: ' 太郎') #=> #<User:0x0000000106c00ab0 @name=" 花子"> ゲッターメソッドがバリデーションに使われるまでの流れ class User include ActiveModel::API validates :name, presence: true def name " 花子" end end user = User.new() user.valid? #=> true
:age end User.new(name: ' 太郎', age: 20) #=> #<User:0x0000000107a59e40 @age=20, @name=" 太郎"> module ActiveModel module API def initialize(attributes = {}) assign_attributes(attributes) if attributes super() end end end
raise ArgumentError, "When assigning attributes, you must pass a hash as an argument, #{new_attributes.class} passed." end return if new_attributes.empty? _assign_attributes(sanitize_for_mass_assignment(new_attributes)) end alias attributes= assign_attributes private def _assign_attributes(attributes) attributes.each do |k, v| _assign_attribute(k, v) end end def _assign_attribute(k, v) setter = :"#{k}=" if respond_to?(setter) # User.new(name: " 太郎") の場合 # public_send(:name=, ' 太郎') public_send(setter, v) else raise UnknownAttributeError.new(self, k.to_s) end end end end
validates :name, presence: true def name " 太郎" end end user = User.new() user.valid? #=> true ゲッターメソッドを削除するとエラーが出る class User include ActiveModel::API validates :name, presence: true end user = User.new() user.valid? # activemodel-7.1.2/lib/active_model/validator.rb:152:in `block in validate': # undefined method `name' for #<User:0x0000000104f748d8 @validation_context=nil, @errors=#<ActiveModel::Errors []>> (NoMethodError) # value = record.read_attribute_for_validation(attribute)
callbacks.empty? yield if block_given? else env = Filters::Environment.new(self, false, nil) next_sequence = callbacks.compile(type) # Common case: no 'around' callbacks defined if next_sequence.final? next_sequence.invoke_before(env) env.value = !env.halted && (!block_given? || yield) next_sequence.invoke_after(env) env.value else # 省略 end end end