Skip to content

Instantly share code, notes, and snippets.

@jonathanccalixto
Last active August 26, 2016 00:56
Show Gist options
  • Save jonathanccalixto/0d8753c27d461e5e59ef1e448d9f2a20 to your computer and use it in GitHub Desktop.
Save jonathanccalixto/0d8753c27d461e5e59ef1e448d9f2a20 to your computer and use it in GitHub Desktop.
Um exemplo simples de utilização de um FormObject
class UsuarioConvenio
include ActiveModel::Modelze
attr_accessor :id, :nome, :senha, :estabelecimento_id
validates :nome, :email, :senha, :estabelecimento, presence: true
validate :garantindo_que_o_estabelecimento_eh_de_um_convenio_valido
def self.create(params)
object = new(params)
object.save
object
end
def self.create!(params)
object = new(params)
object.save!
object
end
def self.find(id)
new(id: id)
end
def attributes=(params)
params.each do |attr, value|
self.public_send("#{attr}=", value)
end
end
def usuario(force_reload = false)
@usuario = nil if force_reload
@usuario ||= Usuario.find_by(id: self.id)
end
def estabelecimento(force_reload = false)
@estabelecimento = nil if force_reload
@estabelecimento ||= Estabelecimento.find_by(id: self.estabelecimento_id)
end
def convenio(force_reload = false)
@convenio = nil if force_reload
@convenio ||= Convenio.find_by(estabelecimento_id: self.estabelecimento)
end
def update_attributes(params = {})
attributes = params
save
end
def update_attributes!(params = {})
attributes = params
save!
end
def save!
ActiveRecord::Base.transaction do
(usuario || construir_usuario).attributes = {
nome: nome,
email: email,
senha: senha,
}
usuario.save!
if usuario.meus_convenios.find_by(convenio_id: convenio)
usuario.meus_convenios.create! convenio
end
end
true
end
def save
return false if invalid?
save!
rescue Exception
false
end
def to_s
"#{user}"
end
protected
def construir_usuario
@usuario = Usuario.new
end
def garantindo_que_o_estabelecimento_eh_de_um_convenio_valido
if convenio.nil?
errors.add :estabelecimento_id, :invalid
elsif usuario && usuario.meus_convenios.find_by(convenio_id: convenio)
errors.add :estabelecimento_id, :taken
end
end
end
class UsuariosController < ApplicationController
def new
@usuario = UsuarioConvenio.new
end
def create
@usuario = UsuarioConvenio.create(usuario_params)
end
def edit
@usuario = UsuarioConvenio.find(id)
end
def update
@usuario = UsuarioConvenio.find(id)
@usuario.update_attributes(usuario_params)
end
end
@jonathanccalixto
Copy link
Author

jonathanccalixto commented Aug 26, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment