Capítulo 13
Mais sobre views
13.1 - Helpers customizados
Quando criamos um controller, o Rails automaticamente cria um helper para esse controller em app/helpers/. Todo método escrito num helper, estará automaticamente disponível em sua view. Existe um Helper especial, oapplication_helper.rb, cujos métodos ficam disponíveis para todas as views.
13.2 - Exercícios: Formatando valores monetários
c. def valor_formatado(number)
h. end
j. @qualificacao.valor_gasto
por:
valor_formatado(@qualificacao.valor_gasto)
13.3 - Partials e a opção locals
A forma como o usuário cria comentários agora é claramente contra indicativa. O usuário tem que indicar o id do restaurante que irá comentar e que é um restaurante e não uma qualificação.
Para melhorar a usabilidade iremos adicionar uma caixa de texto na página de visualização do restaurante, dessa forma, o usuário poderá comentar o restaurante da própria página do restaurante.
Partial para formulário de comentário
Para criar o formulário teríamos que adicionar o seguinte código erb na view show do restaurante:
<%= form_for comentario.new do |f| %>
<%= f.hidden_field :comentavel_id, value: @restaurante.id %>
<%= f.hidden_field :comentavel_type, value: @restaurante.class %>
<%= f.label :conteudo %><br />
<%= f.text_area :conteudo %>
<%= f.submit %>
<% end %>
Essa alteração serviria para o caso do usuário poder comentar só o restaurante, porém no nosso sistema, uma qualificação também pode ser comentada. Logo, precisaríamos do mesmo formulário na view show de qualificação.
Logo, a solução que nos permitiria reaproveitar o erb do formulário seria extrair o formulário para um partial:
<%= form_for comentario.new do |f| %>
<%= f.hidden_field :comentavel_id, value: @restaurante.id %>
<%= f.hidden_field :comentavel_type, value: @restaurante.class %>
<%= f.label :conteudo %><br />
<%= f.text_area :conteudo %>
<%= f.submit %>
<% end %>
Porém, esse nosso partial faz uso da variável @restaurante, que não existe na view show de uma qualificação. Precisamos de um partial mais genérico, que se utilize de um comentável qualquer. Porém com o conhecimento que temos até agora isso não é possível.
Partial mais flexível com a opção locals
Para termos nosso partial genérico, iremos utilizar a opção locals. Com ela podemos passar algo parecido com um parâmetro. O locals é utilizado na chamada do método render.
Nas view show de restaurantes iremos renderizar o partial da seguinte maneira:
<%= render partial: "comentarios/novo_comentario",
locals: {comentavel: @restaurante} %>
Já na view show de qualificacoes iremos passar a variável @qualificacao:
<%= render partial: "comentarios/novo_comentario",
locals: {comentavel: @qualificacao} %>
Dessa forma, teremos disponível no nosso partial, uma variável comentavel e para utilizar essa variável iremos mudar o conteúdo do partial para:
<%= form_for Comentario.new do |f| %>
<%= f.hidden_field :comentavel_id, value: comentavel.id %>
<%= f.hidden_field :comentavel_type, value: comentavel.class %>
<%= f.label :conteudo %><br />
<%= f.text_area :conteudo %>
<%= f.submit %>
<% end %>
Agora sim, nosso partial está flexível o suficiente para ser utilizado nas duas situações. Poderíamos melhorar ainda mais o código, encapsulando a chamada aorender em um helper:
def novo_comentario(comentavel)
render partial: "comentarios/novo_comentario",
locals: {comentavel: comentavel}
end
Dessa forma poderíamos renderizar o partial simplesmente chamando o helper:
<%= novo_comentario @restaurante %>
Ou no caso da qualificação:
<%= novo_comentario @qualificacao %>
13.4 - Exercícios: Formulário para criar um novo comentário
Criar comentários usando o formulário padrão é algo pouco usual. Por isso tornaremos possível criar um comentário para um restaurante ou uma qualificação, apartir de sua página de visualização.
Ou seja, ao visualizar um restaurante ou qualificação, poderemos comentá-los através de um formulário.
c. <%= form_for Comentario.new do |f| %>
k. <% end %>
c. def novo_comentario(comentavel)
f. end
b. <%= novo_comentario @restaurante %>
13.5 - Partials de coleções
Nosso primeiro passo será possibilitar a inclusão da lista de comentários nas páginas de qualquer modelo que seja comentável. Para não repetir este código em todas as páginas que aceitem comentários, podemos isolá-lo em um partial:
<!-- app/views/comentarios/_comentario.html.erb -->
<p>
<%= comentario.conteudo %> -
<%= link_to '(remover)', comentario, :method => :delete %>
</p>
Perceba que não queremos renderizar esse partial uma única vez. Para cada comentário na array, devemos renderizar o partial, no final teremos um HTML com vários parágrafos.
Para fazer algo do tipo, teríamos que ter um ERB como:
<% @restaurante.comentarios.each do |comentario| %>
<%= render partial: "comentarios/comentario",
locals: {comentario: comentario} %>
<% end %>
Podemos simplificar o código acima, utilizando a opção :collection. Dessa maneira, o partial é renderizado uma vez para cada elemento que eu tenha no meu array:
<%= render partial: "comentarios/comentario",
collection: @restaurante.comentarios %>
Perceba que nosso objetivo aqui é renderizar uma coleção. Estamos usando algumas convenções do Rails que irão permitir simplificar ainda mais o código acima. Além de criar uma variável com o o mesmo nome do partial que vamosrenderizar, no nosso exemplo essa variável será chamada comentario, o Railstambém será capaz de decidir qual é o arquivo partial que deve ser utilizado para exibir os itens de uma coleção.
Como temos uma coleção de comentários para exibir, basta invocar o métodorender passando a coleção como parâmetro, e o Rails cuidará do resto. Assim será possível omitir tanto o nome do partial como o hash que passamos como parâmetro anteriormente. Vamos fazer essa simplificação em nosso código e além disso garantir que a coleção seja renderizada apenas se não estiver vazia, dessa forma:
<%= render @restaurante.comentarios %>
13.6 - Exercícios: Listando os comentários de um comentável
Assim como o formulário, a listagem tem que ser implementada de forma que seja reaproveitada nas views dos restaurantes e das qualificações, através de partials.
1234
c. <div id="comentarios">
j. </div>
1234
c. <%= comentarios @restaurante %>
13.7 - Layouts
Como vimos, quando criamos um Partial, precisamos declará-lo em todas as páginas que desejamos utilizá-los. Existe uma alternativa melhor quando desejamos utilizar algum conteúdo estático que deve estar presente em todas as páginas: o layout.
Cada controller pode ter seu próprio layout, e uma alteração nesse arquivo se refletirá por todas as views desse controller. Os arquivos de layout devem ter o nome do controller, por exemplo app/views/layouts/restaurantes.html.erb.
Um arquivo de layout "padrão" tem o seguinte formato:
<html>
<head>
<title>Um título</title>
</head>
<body>
<%= yield %>
</body>
</html>
Tudo o que está nesse arquivo pode ser modificado, com exceção do <%= yield %>, que renderiza cada view do nosso controlador.
Podemos utilizar ainda o layout application.html.erb. Para isso, precisamos criar o arquivo app/views/layouts/application.html.erb e apagar os arquivos de layout dos controladores que queremos que utilizem o layout do controlador application. Com isso, se desejarmos ter um layout único para toda nossa aplicação, por exemplo, basta ter um único arquivo de layout.
13.8 - Exercícios: Criando um menu de navegação principal
c. <body>
m. </body>
13.9 - Exercícios Opcionais: Menu como partial
c. <ul>
i. </ul>
c. ...
d. <body>
i. </body>
j. ...
c. def menu_principal(controllers)
e. end
c. ...
d. <body>
h. </body>
i. ...
13.10 - Aplicar CSS em apenas algumas views
Nossa listagem de comentários está com uma aparência muito desagradável, por isso iremos aplicar um CSS especial nas páginas que utilizarem nosso partial com os comentários.
É boa prática no desenvolvimento front-end, que importemos o CSS sempre dentro da tag <head>, porém se importarmos o CSS no application.html.erb esse CSS será importado desnecessariamente em todas as views de nossa aplicação.
Precisamos implementar nossas views de forma que a importação do nosso novo CSS seja feita somente se o partial _comentarios.html.erb for utilizado. Para fazer isso, teremos que utilizar o yield de uma forma diferente.
Primeiramente, iremos adicionar uma chamada ao yield :css dentro deapp/views/layouts/application.html.erb, fazendo isso, estaremos tornando possível para a view inserir um conteúdo chamado :css naquela posição do layout. Nosso application.html.erb deve conter o seguinte ERB:
<head>
<!-- (...) -->
<%= stylesheet_link_tag "application", :media => "all" %>
<%= yield :css %>
<!-- (...) -->
</head>
Fazendo isso, tornamos possível que uma view ou partial possa inserir um conteúdo chamado :css. Agora precisamos fazer com que o partial_comentarios.html.erb defina um conteúdo :css importando o nosso CSS especial. Para isso, iremos chamar o método content_for em qualquer lugar do partial, dessa forma:
<% content_for :css do %>
<link rel="stylesheet" href="/stylesheets/comentarios.css">
<% end %>
Após adicionar essas duas chamadas, nosso CSS será aplicado somente nas views que utilizam o partial _comentarios.html.erb.
13.11 - Exercícios: Aplicando CSS para os comentários
Vamos configurar nosso layout e partials de forma que o CSS que irá estilizar os comentários só seja aplicado nas views necessárias:
c. <% content_for :css do %>
e. <% end %>
c. <%= stylesheet_link_tag "application", :media => "all" %>
d. <%= yield :css %>
Xo สล็อตออนไลน์ โปรสล็อต XO เกมออนไลน์ทำเงินยอดฮิตเกมสล็อต xopg.net คือเกมทำเงิน reeffutures2018 ผ่านทางออนไลน์อย่างหนึ่ง ที่เล่นง่าย และได้เงินไว แถมยังลงทุนด้วยเงินน้อย mavoixtavoie ทำเงินได้ตลอดเวลา ซึ่งหลายคนอาจได้เคยเห็นรีวิวเรื่องของ สล็อต xo สล็อตออนไลน์ ไว้มากมาย เทคนิคสล็อต ทั้งเรื่องการเล่นแล้วได้เงิน herbalpertpresents และเล่น สล็อต แล้วไม่ได้เงิน นั่นเองค่ะ ซึ่งการที่คุณจะเล่นได้เงินหรือไม่ได้เงินนั้น essentialsforasoul ส่วนหนึ่งก็เป็นในเรื่องของดวงเข้ามาเกี่ยวด้วย northbristol เพราะสล็อตเป็นเกมออนไลน์เสี่ยงโชค ทดลองเล่น xo เกมหนึ่งซึ่งจะมีสูตร หรือเทคนิคเข้ามาช่วย gclub เพื่อโกงดวงอยู่เสมอซึ่งในเว็บของเรา สมัคร xo ก็มีมาแนะนำไว้ให้เห็นกันมากมายหลายสูตร
Make the most of mainly premium substances - you will find him or her for: 사설토토
I use only high quality materials - you can see them at: 안전놀이터
I've proper selected to build a blog, which I hold been deficient to do for a during. Acknowledges for this inform, it's really serviceable! 벳삼
I've proper selected to build a blog, which I hold been deficient to do for a during. Acknowledges for this inform, it's really serviceable! 꽁머니사이트
There you can download for free, see the first of these data. 링크찾기
My personal sis recommended me personally about your own internet website and exactly how excellent it really is. She’s correct, I’m really impressed with the writing and clever design. It appears in my experience you are merely itching the surface when it comes to what you might achieve, nevertheless you’re on a good begin! 토토사이트
Sometimes your blog is loading slowly, better find a better host.”-”` 토토커뮤니티
You produced some decent points there. I looked online for that problem and located most individuals should go as well as using your internet site. 꽁머니
Methods for dilution antimicrobial susceptibility beadlets for beagles that grow aerobically—fifth edition. black puffer case
Sometimes, blogging is a bit tiresome specially if you need to update more topics.;’*~. 먹튀검증
I was reading some of your content on this website and I conceive this internet site is really informative ! Keep on putting up. pods official website
Loving the information on this web site , you have done great job on the posts . Window Tinting
Hiya! awesome blog! I happen to be a daily visitor to your site (somewhat more like addict ) of this website. Just wanted to say I appreciate your blogs and am looking forward for more to come! Roof Damage Repair In Jersey Village
Things i have seen in terms of computer memory is the fact there are technical specs such as SDRAM, DDR and many others, that must match the features of the motherboard. If the personal computer’s motherboard is fairly current while there are no operating-system issues, changing the memory literally takes under sixty minutes. It’s one of several easiest personal computer upgrade techniques one can picture. Thanks for giving your ideas. dCas9-GFP
of course data entry services are very expensive that is why always make a backup of your files“ Delta Airlines Reservations
I am really inspired with your writing talent well with the layout to your weblog. Is this a paid topic or did you modify it your self? Anyway stay up the excellent high quality writing, it’s rare to peer a great blog like this one nowadays. Handle Replacement Palm Beach County FL
We would like to thank you just as before for the stunning ideas you offered Jesse when preparing her own post-graduate research and, most importantly, regarding providing every one of the ideas in one blog post. In case we had been aware of your web page a year ago, we might have been saved the unwanted measures we were implementing. Thank you very much. neon pink angelfish
We would like to thank you just as before for the stunning ideas you offered Jesse when preparing her own post-graduate research and, most importantly, regarding providing every one of the ideas in one blog post. In case we had been aware of your web page a year ago, we might have been saved the unwanted measures we were implementing. Thank you very much. neon pink angelfish
I’ve recently started a site, the information you offer on this web site has helped me greatly. Thank you for all of your time & work. dCas9-GFP