Nested Attributes é um ponto interessante que veio junto com o Rails 2.3. Chegou para simplificar o uso de formulários complexos e simplificar o acesso desses atributos.
Este artigo será um tutorial de como usar nested attributes em conjunto com models que trabalham com imagens e fazendo upload usando o paperclip.
Para começarmos, ja vamos partir do pré-suposto que você já possua instalado o rails e todas as gems que fazem parte e que já tenha instalado o paperclip.
Para começar vamos criar um novo projeto Rails para este tutorial:
Agora vamos gerar dois scaffolds, um para Product e outro para Picture, model que será responsável por tratar as imagens:
Depois de tudo gerado, é hora de brincarmos com os models. Primeiro vamos dizer que o model Product possue várias Pictures e adicionarmos que ele aceita os atributos aninhados para Pictures:
1 4 end 5
Agora, vamos dizer que picture possue um product e que possue um arquivo em anexo chamado image:
1 4 end 5
Com isso, os models já funcionam com atributos aninhados. As views agora! Vamos adicionar a Picture em new.html.erb e adicionar uma partial, essa partial é o inicio das mágicas ;)
1 New product 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
A partial vai ficar assim:
Se o formulário passado pra view for um objeto novo, então ele vai mostrar um file field para uma foto, se não for, ele vai carregar um thumb e adicionar uma box para deletar a imagem.
Agora, vamos adicionar um método no helper, que vai adicionar dinamicamente novos arquivos para fazer upload:
1 15 end
Adicionando o método criado, poderemos adicionar vários arquivos para fazer upload:
1 New product 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
Ao iniciarmos o servidor (http://localhost:3000/products/new) veremos o link Add Picture.
Não se esqueça de incluir os javascripts no layout <%= javascript_include_tag :all, :cache => true %>
Com isso você tem um ponta pé inicial para trabalhar com atributos aninhados na sua aplicação. Não é difícil usar atributos aninhados com paperclip, que agrega outra função para o model. Você pode por exemplo usar atributos aninhados dentro de um outro model, que está em um outro model e que está em um outro model… Não existe limites para isso :)
UPDATE: Obrigado ao Jésus Lopes que descobriu alguns bugs (na partial e no helper) que já foram devidamente corrigidos ;)





Ei cairo que tal você printar umas imagens da tela?
grato!
Não precisa :P
Já que no final vai funcionar tudo bonitinho ;)
Fala Cairo,
Fiz tudo igual seu tutorial, mas não sei pq os campos que adiciono depois, não passam parametros, você tem alguma idéia?
olá Cairo
Existem 3 imagens quebradas nesse tutorial, podia nos ajudar recolocando, pois preciso saber como é esse scaffold.
Obrigado
Poderia arrumas as imagens por favor?