---
# System prepended metadata

title: Do Rails pro Phoenix

---

# Do Rails pro Phoenix
Ao mapear algumas dificuldades da transição do Rails pro Phoenix, percebi um certo padrão para alguns pontos que retardam o processo de _ramp up_ no Phoenix. Separei-os em tópicos, sintam-se à vontade para incrementá-los ou adicionar mais tópicos a este post.

## Tópicos

### É MVC, mas cadê os meus modelos?
Ao ler a [Documentação](https://hexdocs.pm/phoenix/overview.html) do Phoenix, de imediato nos deparamos com a seguinte colocação:

> Phoenix is a web development framework written in Elixir which implements
the server-side Model View Controller (MVC) pattern. Many of its components
and concepts will seem familiar to those of us with experience in other
web frameworks like Ruby on Rails or Python’s Django.

Pra quem vem do contexto de Rails, por coincidência, o público alvo desse post, ler esse trecho traz certa tranquilidade. Entretanto, ao usarmos um `mix phx.new`, nos deparamos com uma realidade diferente do que nos era comum no Rails e logo ocorre uma quebra de expectativas:

```
- Cadê meu MVC, onde estão os models?
- O que são esses templates? Essas views são helpers??
```
Visando esse tipo de situação, é recomendada a leitura dos materiais introdutórios da seção [Geral](##Geral).

### Ecto é bem diferente do ActiveRecord
Em um único objeto no ActiveRecord, podemos checar um atributo utilizando  `user.name`, mas também podemos realizar uma ação utilizando `user.confirm()`. Esse acoplamento de estado e comportamento é algo que pode ser difícil de abrir mão em um primeiro momento.

Para quem nunca trabalhou com banco de dados relacionais utilizando uma abordagem diferente de Active record, a separação de responsabilidades imposta pelo Repository Pattern pode ser bem trabalhosa de início. Tendo isso em vista, recomenda-se a leitura dos materiais sugeridos no tópico: [Ecto e Repository pattern](##Ecto-e-Repository-pattern)

###  O que são os contexts? É a mesma coisa que usar models?
Na versão 1.3 do Phoenix houveram mudanças drásticas na forma em que o código é organizado, paramos de usar o **M** do MVC e passamos a separar nosso código em _contexts_.

Apesar do Phoenix ser flexível na organização de código, encontrar a lógica de negócios separada em contextos é o caso mais comum em suas aplicações, alguns dos questionamentos que podem surgir são:
```
- Onde coloco a lógica de negócios da minha aplicação?
- Qual a diferença do user.ex pro users.ex? Em qual eu coloco minhas funções?
- Quem é o meu model aqui dentro?
```

Nesse caso, é recomendada a leitura dos materiais no tópico: [Bounded Contexts](##Bounded-contexts)

## Materiais introdutórios
### Geral
* Documentação oficial do [Phoenix](https://hexdocs.pm/phoenix/Phoenix.html)
* Leitura da parte 1 do [Programming Phoenix](https://lore.ptec.me/t/programming-phoenix-v1-4-chris-mccord-bruce-tate-jose-valim/1340) 

### Ecto e Repository pattern
* Palestra da Amanda na ElixirConf 2019 [Lessons Learned From an Elixir/OTP Project](https://www.youtube.com/watch?v=VaratZ_5154)
* Leitura do segundo capítulo do [The Little Ecto Cookbook](https://lore.ptec.me/t/the-little-ecto-cookbook/1574) : “Ecto is not your ORM”
* Leitura da parte 1 do [Programming Ecto](https://lore.ptec.me/t/programming-ecto-darin-wilson-and-eric-meadows-jonsson/1417) 

### Bounded contexts
* Post no lore [DDD no Phoenix 1.3](https://lore.ptec.me/t/ddd-no-phoenix-1-3/728) 
* Post no lore [Referências teóricas sobre Domain-driven Design (DDD)](https://lore.ptec.me/t/referencias-teoricas-sobre-domain-driven-design-ddd/1523)  
* Blog post [Putting Contexts in Context | Michał Muskała](https://michal.muskala.eu/2017/05/16/putting-contexts-in-context.html)
* Blog post [Lessons From Using Phoenix 1.3](https://thoughtbot.com/blog/lessons-from-using-phoenix-1-3)
* Capítulo 12 do [Programming Ecto](https://lore.ptec.me/t/programming-ecto-darin-wilson-and-eric-meadows-jonsson/1417) 
* Palestra do Andrew Hao na ElixirDaze 2018 [Building beautiful systems with Phoenix contexts](https://youtu.be/l3VgbSgo71E)
