Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Operações da view para o controller

Olá pessoal! Estou fazendo um exemplo em rails pra uma planilha. Basicamente, minhas entidades são Funcao, Funcao_Valor, Categoria, Categoria_item e a planilha que daí puxar os dados. Ao criar um função eu escolho uma ou mais categorias p ela, cada categoria de um ou mais itens (cada item tem os atributos nome e uma variável de valor em decimal que vai servir como porcentagem). Após criar a função eu adiciono um preço\valor pra essa profissão. O que a planilha faz é basicamente pegar esses dados e exibir quanto % cada item representa do valor da função que eu atribuí. O transtorno é que essas operações eu fiz pela view e não pelo controller, pq qndo eu faço por ele, ele não exibe todos os elementos, apenas o primeiro que acha. Minhas duvidas são de como faço pra somar esses valores e como eu faço pra realizar essas operações no controller com sucessor?

            <table style="width:620px">
                <% @f = Funcao.find(:first, :conditions =>  ["fnome =?", @planilha.pfuncao ]) %>
                <% @f.funcao_atributos.each do |f| %>
                <thead>
                    <tr><th><%= f.aordem %> - <%= f.anome %></th></tr>
                </thead>
                <tbody>
                    <tr>
                        <tr>
                            <td>
                            <% @k = FuncaoAtributo.find(:first, :conditions =>  ["anome =?", f.anome ]) %>
                                <table style="width:600px">
                                    <thead>
                                    </thead>
                                    <tbody>
                                        <tr>
                                            <% @k.funcao_atributo_items.each do |i| %>
                                            <tr>
                                                <td><%= i.iordem %></td>
                                                <td><%= @teste.item %></td>
                                                <td><%= " #{i.ivalor}%" %></td>
                                                <td>
                                                <% @valor = Funcao.find(:first, :conditions =>  ["fnome =?", @planilha.pfuncao ]) %>
                                                <% @valor.funcao_precos.each do |valor| %>                                                    
                                                    <% @total = (valor.preco * i.ivalor)/100 %>
                                                    <%= @total %>
                                                <% end %>
                                                </td>
                                            </tr>
                                            <% end %>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                            <% end %>
                        </tr>
                    </tr>
                </tbody>
            </table>
3 respostas

Oi Roberto,

O passo importante é você saber que isso deve ser feito no controller. Primeiro renomearia as variáveis, você tem @f e f. Além de k e i. Coloque nomes que façam mais sentido que ai fica mais fácil de ver um possível problema. Depois disso jogue o código no controller e posta aqui para que eu possa dar uma olhada?

Abraço

Olá Guilhe! Reformulei o código pra talvez deixar menos confuso, só pra informar tbm as tabelas possuem os seguintes nomes e colunas: funcao(fnome), funcao_preco(preco), funcao_atributo(anome), funcao_atributo_item(item, ivalor, irdem) e por ultimo planilha(pfuncao).

O trecho do código da view refeito ta assim, espero que fique mais claro:

<table style="width:620px">
                <% @funcao = Funcao.find(:first, :conditions =>  ["fnome =?", @planilha.pfuncao ]) %>
                <% @funcao.funcao_atributos.each do |funcao| %>
                <thead>
                    <tr><th><%= funcao.aordem %> - <%= funcao.anome %></th></tr>
                </thead>
                <tbody>
                    <tr>
                        <tr>
                            <td>
                            <% @funcaoatributo = FuncaoAtributo.find(:first, :conditions =>  ["anome =?", funcao.anome ]) %>
                                <table style="width:600px">
                                    <thead>
                                    </thead>
                                    <tbody>
                                        <tr>
                                            <% @funcaoatributo.funcao_atributo_items.each do |item| %>
                                            <tr>
                                                <td><%= item.iordem %></td>
                                                <td><%= item.item %></td>
                                                <td><%= " #{item.ivalor}%" %></td>
                                                <td>
                                                <% @valor = Funcao.find(:first, :conditions =>  ["fnome =?", @planilha.pfuncao ]) %>
                                                <% @valor.funcao_precos.each do |valor| %>                                                    
                                                    <% @total = (valor.preco * item.ivalor)/100 %>
                                                    <%= @total %>
                                                <% end %>
                                                </td>
                                            </tr>
                                            <% end %>
                                        </tr>
                                    </tbody>
                                </table>
                            </td>
                            <% end %>
                        </tr>
                    </tr>
                </tbody>
            </table>
solução!

Tudo bem Roberto?

No seu controller você pode fazer a primeira busca e atribuir a variável membro a "@funcao". Ai você elimina a primeira busca que escreveu.

Repara que @valor = @funcao, então não precisa daquela linha, faz sentido? Pode usar @funcao ao inves de @valor.

Só sobra agora mais um finder, que é o FuncaoAtributo.find. Você executa um find para sua funcao, procurando o primeiro atributo que tem tal nome. Uma sacada simples para tirar ele daí (mas não colocar no melhor lugar ainda) é simplesmente colocar na sua classe Funcao:

def buscaAtributo
  FuncaoAtributo.find(:first, :conditions =>  ["anome =?", anome ])
end

E ai na sua view voce fica com @funcao_atributo = @funcao.buscaAtributo