Para possibilitar a adição de comentários podemos adicionar um novo link logo após a lista de comentários, criando um novo helper method noApplicationController:
def novo_comentario(comentavel)
comentarios = render(:partial => "comentarios/novo_comentario", :locals => { :comentavel => comentavel }) raw comentarios
end
É necessário agora criar o novo partial. Lembre que para criar um comentário, é preciso saber o que está sendo comentado (comentável).
<!-- /app/views/comentarios/_novo_comentario.html.erb -->
<div id=’novo_comentario’>
<a href="javascript:$(’#novo_comentario’).children().toggle();">Novo comentario</a>
<div id="form_contato" style="display: none;">
<%= form_for Comentario.new, :remote => true do |f| %>
<%= hidden_field :comentario, :comentavel_id, :value => comentavel.id %>
<%= hidden_field :comentario, :comentavel_type, :value => comentavel.class %>
<div class="field">
<%= f.label ’conteudo’ %><br />
<%= f.text_area ’conteudo’ %>
Capítulo 12 - Ajax com Rails - Adicionando comentários - Página 146
Material do Treinamento Desenvolvimento Ágil para Web 2.0 com Ruby on Rails
</div>
<div class="actions">
<%= f.submit %>
<a href="javascript:$(’#novo_comentario’).children().toggle();">Cancelar</a>
</div>
<% end %>
</div>
</div>
<%content_for :js do%>
$(’#form_contato’).bind(’ajax:complete’, function(xhr, result){
$(’#comentarios’).html(result.responseText);
$(’#form_contato textarea’).val("")
$(’#form_contato’).hide();
$(’#novo_comentario > a’).show();
});
<%end%>
12.6 - Exercícios
1) Vamos permitir a adição de novos comentários:
a) Abra o arquivoapp/helpers/application_helper.rb
b) Vamos criar um novo método nesseHelper. A função desse método será renderizar umpartial contendo o link para criação de novos comentários. Para isso, adicione o métodonovo_comentariona sua classe ApplicationHelper:
def novo_comentario(comentavel)
raw render(:partial => "comentarios/novo_comentario", :locals => { :comentavel => comentavel }) end
Capítulo 12 - Ajax com Rails - Exercícios - Página 147
c) Crie o novo partialapp/views/comentarios/_novo_comentario.html.erbcom o seguinte conteúdo:
<div id=’novo_comentario’>
<a href="#" onclick="$(’#novo_comentario’).children().toggle();">Novo comentario</a>
<div id="form_contato" style="display: none;">
<%= form_for Comentario.new, :remote => true do |f| %>
<%= hidden_field :comentario, :comentavel_id, :value => comentavel.id %>
<%= hidden_field :comentario, :comentavel_type, :value => comentavel.class %>
<div class="field">
<%= f.label ’conteudo’ %><br />
<%= f.text_area ’conteudo’ %>
</div>
<div class="actions">
<%= f.submit %>
<a href="#" onclick="$(’#novo_comentario’).children().toggle();">Cancelar</a>
</div>
<% end %>
</div>
</div>
<%content_for :js do%>
$(’#form_contato’).bind(’ajax:complete’, function(xhr, result){
$(’#comentarios’).html(result.responseText);
$(’#form_contato textarea’).val("")
$(’#form_contato’).hide();
$(’#novo_comentario > a’).show();
});
<%end%>
Capítulo 12 - Ajax com Rails - Exercícios - Página 148
Material do Treinamento Desenvolvimento Ágil para Web 2.0 com Ruby on Rails
d) O link deverá ser colocado após a verificação da existência de comentários para mostrar a lista dos comentários, para isso, abra o arquivoapp/views/restaurantes/show.html.erbe abaixo dounlessque faz a verificação adicione a chamada para o seu novoHelper:
<% unless @restaurante.comentarios.empty?%>
<%= comentarios @restaurante %>
<% end %>
<%= novo_comentario(@restaurante) %>
e) Faça o mesmo para o arquivoapp/views/comentarios/show.html.erb.
f) Para finalizar o processo temos que alterar o nosso controller para exibir a lista de comentários do nosso comentável. Altere o método create no app/controllers/comentarios_controller.rb
if @comentario.save
format.xml { render :xml => @comentario, :status => :created, :location => @comentario } format.js {}
else
g) E agora crie o arquivo views/comentarios/create.js.erb
<%= render(:partial => "comentarios/comentario",
:collection => @comentario.comentavel.comentarios) %>
h) Para que nosso partial exiba corretamente os javascripts precisamos criar um layout para colocar o bloco de yield dos javascripts.
i) Crie o arquivo app/views/layouts/application.js.erb com o seguinte conteúdo
<%= yield %>
<script type="text/javascript">
Capítulo 12 - Ajax com Rails - Exercícios - Página 149
<%=yield :js%>
</script>
j) Agora já é possível cadastrar um comentário direto do show dos comentáveis
Capítulo 12 - Ajax com Rails - Exercícios - Página 150
CAPÍTULO
13 Alguns Plugins e Gems Importantes
“A minoria pode ter razão, a maioria está sempre errada”
–Mikhail Aleksandrovitch Bakunin
13.1 - Paginação
O uso do plugin will_paginate sempre foi recomendado ao invés da forma clássica de paginação embutida no Rails 1.2.
No Rails 2.0, a paginação foi removida para o plugin classic_pagination e agora você deve escolher qual usar.
Hoje o will_paginate é um gem. Para poder usá-lo nas suas aplicações Rails, abra o arquivo Gemfile e adicione a seguinte linha:
gem install will_paginate
A documentação pode ser encontrada no wiki hospedado no github.com:
http://github.com/mislav/will_paginate/wikis
Após a instalação do gem, para usá-lo em uma aplicação Rails, basta inserir no final do arquivoGemfile:
gem "will_paginate", "~> 3.0.pre2"
Para trazer os dados paginados, basta usar o métodopaginate, no lugar defind:
@restaurantes = Restaurante.paginate :page => params[’page’]
O métodopaginatefunciona como um finder normal. Suporta todas as opções previamente vistas, como :conditions,:ordere:include.
O número de items por página é padronizado em 30, mas você pode customizar de duas formas. Através do método per_page nas classesActiveRecord::Base:
class Restaurante < ActiveRecord::Base def self.per_page
10 end
# ...
end
Ou passando como parâmetro ao métodopaginate:
@restaurantes = Restaurante.paginate :page => params[’page’], :per_page => 10 151
O gem fornece ainda um helper para inclusão dos links de paginação em qualquer view:
# index.html.erb
<% @restaurantes.each do |restaurante| %>
<li><%= restaurante.nome %></li>
<% end %>
<%= will_paginate @restaurantes %>
Alguns exemplos de estilos (css) alternativos para a paginação podem ser encontrados em:
http://mislav.caboo.se/static/will_paginate/