Onde implementar um novo método ou variável?


Como sabemos, o framework  Ruby on Rails é baseado na arquitetura MVC. Desta forma, as principais pastas do projeto abaixo do nível /app são:
  • assets: onde ficam os CSS, JavaScripts e Imagens da aplicação.
  • models: onde ficam os objetos da aplicação, geralmente representam uma tabela do Banco de Dados ou um Relacionamento entre tabelas. 
    • O nome dos arquivos geralmente estão no padrão "<nome_da_tabela>.rb"
  • controllers: onde ficam as classes de controle, que permitem que os objetos (model) acessem a camada de apresentação (view). 
    • O nome dos arquivos geralmente estão no padrão "<nome_da_tabela>s_controller.rb"
    • Observe que o nome da tabela deve ser no plural.
  • views: onde ficam as páginas html da aplicação.
    • O nome dos arquivos geralmente estão no padrão "<metodo_do_controlador>".html.erb
Desta forma, o programador tem que saber onde irá criar novos métodos na aplicação, de forma que eles fiquem visíveis na camada de apresentação (View).


Quando for necessário criar um método para substituir uma coluna da tabela do Banco de Dados, onde este método poderá ser utilizado por qualquer página da aplicação, deve-se criar um método na classe do "Model", por exemplo:

#----tarefa.rb
#Custo de cada tarefa
      def custo(valor_hora)         
                return self.tempo_gasto * valor_hora
     end


Quando for necessário criar uma variável pública para ser utilizada apenas em uma página específica, esta variável deve ser criada no método específico do controlador. Geralmente esta variável é o resultado de uma consulta em várias tabelas do banco de dados:


#----projetos_controller.rb
def show
    #Tarefas do Projeto
    @versao = @projeto.versoes.find_by(projeto_id: @projeto.id) if @projeto
    @tarefas = @projeto.tarefas 


    @tarefas_da_versao = @tarefas.where(versao_id: @versao.id) if @tarefas and @versao
end




Como saber quando usar "find_by" ou "where" na consulta para uma nova variável?

  • Quando o resultado da consulta retornar apenas 1 valor, então deve-se colocar "find_by";
  • Quando o resultado da consulta retornar uma lista de objetos, então deve-se colocar "where";
Na camada de apresentação (View) estas variáveis serão usadas da seguinte forma:

 
Quando a variável retornar apenas 1 resultado, pode se usar a seguinte declaração:

#----view/projetos/show.html.erb
 <%= @versao.nome %>

Quando retornar uma lista de objetos, será necessário fazer um declaração de loop:

#----view/projetos/show.html.erb
<% if @projeto %>
    <% 
@tarefas_da_versao.each do |tarefa| %>
         <li><%= tarefa.titulo %></li>
    <% end %>

<% end %>

Quando o método for declarado no "Model", pode se usar a seguinte declaração:

 #----view/projetos/show.html.erb
<% if @projeto %>
    <%
@tarefas_da_versao.each do |tarefa| %>       
        R$ <%= tarefa.custo(50) %>   
   <% end %>
<% end %>







0 Comentários