• Nenhum resultado encontrado

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/

Documentos relacionados