Last active
August 26, 2016 00:56
-
-
Save jonathanccalixto/0d8753c27d461e5e59ef1e448d9f2a20 to your computer and use it in GitHub Desktop.
Um exemplo simples de utilização de um FormObject
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Author
jonathanccalixto
commented
Aug 26, 2016
•
- Este é um exemplo que atende a thread.
- Os temos e nomenclaturas em português foi para atender a thread supracitada.
- Normalmente, adiciono o usuario_convenio.rb na pasta app/form_objects, que não é padrão do rails, mas que basta ser criado que o proprio rails a reconheçe sem precisar configurar nada.
- Baseado nas referências:
- http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/
- https://robots.thoughtbot.com/activemodel-form-objects
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment