RJS - Saída em Branco

1 view
Skip to first unread message

Felix

unread,
Dec 14, 2009, 12:03:44 PM12/14/09
to rails-br
Pessoal, preciso de uma ajuda hhe,

nunca mechi muito com o RJS do rails, e dessa vez resolvi tentar.
Criei um Dialog com JQuery para fazer uns cadastros básicos na tela, e
gostria que quando fechase a tela após clicar no salvar, atualizasse a
lista na outra pagina.
criei um arquivo create.js.rjs
porém quando ele é executado sai tudo em branco, com try{}catch. e não
executada nada. se eu fizer um

puts request.xhr?

me retorna false, porém o JavaScript funcina normalmente em outros
sites.
Resolvi esse problema do jeito errado :P

respond_to do |format|
format.html { redirect_to url }
format.js
end

respond_to do |format| format.html { redirect_to url } format.js end

Ele redireciona para a pagina, consequentemente atualizando as
informações, porém não é ajax. Alguém ai sabe como concertar isso?

att
Rafael Felix

Márcio

unread,
Dec 14, 2009, 11:28:53 PM12/14/09
to rail...@googlegroups.com
Oi Felix,

Cara não entendi direito, como assim carregar na outra página? não seria na pagina em que vc esta e só recarregar a listagem?
Se puder explicar melhor ou mandar seu código ai pra gente ver, vai ser mais fácil :-)

Abraço.


Márcio Gasparotto
http://www.diretoefacil.com.br


2009/12/14 Felix <felix....@gmail.com>

--

Você está recebendo esta mensagem porque se inscreveu no grupo "rails-br" dos Grupos do Google.
Para postar neste grupo, envie um e-mail para rail...@googlegroups.com.
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.
Para obter mais opções, visite esse grupo em http://groups.google.com/group/rails-br?hl=pt-BR.



Felix

unread,
Dec 15, 2009, 4:29:38 AM12/15/09
to rails-br
Hehhe, to sem o codigo aqui, pra postar, é o seguinte,

Em uma tela eu tenho o metodo show e a view show, ali eu deixo o
usuário alterar os dados.
Ele clica em um link_to_function, esse link, abre um Dialog feito pelo
JQuery, que renderiza o partial com um remote_form_for
E quando o usuário salva, fexa o dialog e teria que na view show,
atualizar a listagem para conter o novo registro inserido, porém ao
invez de fazer o que está no arquivo create.js.rjs, ele simplesmente
mostra o conteudo em uma ela em branco.

Mais ou menos assim
try{
replace(div_id, "<table><tr><td> ...
}catch(e){
}

resolvi esse problema redirecionando, porem ele carrega a pagina toda
a vez.

Obrigado pela resposta

att
Rafael Felix

On 15 dez, 02:28, Márcio <mgasparo...@gmail.com> wrote:
> Oi Felix,
>
> Cara não entendi direito, como assim carregar na outra página? não seria na
> pagina em que vc esta e só recarregar a listagem?
> Se puder explicar melhor ou mandar seu código ai pra gente ver, vai ser mais
> fácil :-)
>
> Abraço.
>
> Márcio Gasparottohttp://www.diretoefacil.com.br
>
> 2009/12/14 Felix <felix.raf...@gmail.com>
> > rails-br+u...@googlegroups.com<rails-br%2Bunsu...@googlegroups.com>
> > .

Felix

unread,
Dec 15, 2009, 4:50:34 AM12/15/09
to rails-br
identifiquei um problema, ele so passa pelo format.html, nunca pelo
format.js
alguem ai já passou por isso?

Frederico Macedo

unread,
Dec 15, 2009, 6:24:39 AM12/15/09
to rail...@googlegroups.com
Colega, tentarei ser didático e breve, seguinte:

Você tem uma requisição e uma resposta.
Não sei como vc está fazendo mas, na requisição têm duas formas de ser chamado usando chamadas inline( via helpers - remote_form_for, link_to_remote - ou usando os eventos dentro de suas tags html) ou usando não obstrusivo( dentro do header vc faz a chamada ajax - js puro).

Quando você usa requisições inline a resposta esperada será sempre no formato js por padrão.
Quando você usa não obstrusivo você tem que especificar qual resposta você está esperando(json, js, text, xml, etc)

No controller que responde a chamada.

Você pode usar o método respond_to caso queria especificar alguma coisa diferente para cada formato mas, por padrão ele chama automaticamente o formato js para os pedidos realizados via link_to_remote ou remote_form_for.
respond_to do |format|
format.html {} # responde para pedidos de
link_to ou form_for

format.js {} # responde para pedidos link_to_remote ou remote_form_for
end

Para usar o rjs basta você criar o arquivo:
app/views/controller_name/metodo.rjs

para testar a reposta pode usar no arquivo rjs

page << "alert('esse eh um teste')"


Talvez eu tenha clariado aí sua dúvida. Provavelmente nesse helper que você criou você não está fazendo a chamada ao método correspondente. Cola o código aí que nós debugamos pra vc.

2009/12/15 Felix <felix....@gmail.com>
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.

Márcio

unread,
Dec 15, 2009, 10:24:51 AM12/15/09
to rail...@googlegroups.com
Então Felix,o Frederico foi bem didático mesmo.

De uma olhada neste post e veja s ajuda, é algo bem parecido com o que vc deseja fazer usando js "puro".

http://www.diretoefacil.com.br/2009/12/09/rails-e-javascript-escrevendo-seu-proprio-javascript/

Abraço!

Márcio Gasparotto
http://www.diretoefacil.com.br


2009/12/15 Frederico Macedo <xant...@gmail.com>

Felix

unread,
Dec 16, 2009, 4:33:07 AM12/16/09
to rails-br
Cara, fiz como vc disse,
no dialog eu tenho um remote_form_for.
no controller eu uso renpond_to para o formato js, e tenho o arquivo
update.js.rjs que faz o alert como vc me mostrou.
após clicar no salvar aparece a seguinte mensagem

Template is missing
update.erb

ou seja, ele não identificou o rjs como um template e ta procurando o
erb. alguma ideia de como faço para ele reconhecer o arquivo rjs? ou
não posso usar o metodo update para fazer isso? melhor usar um metodo
customizado?

att
Rafael Felix

On 15 dez, 09:24, Frederico Macedo <xanth...@gmail.com> wrote:
> Colega, tentarei ser didático e breve, seguinte:
>
> Você tem uma requisição e uma resposta.
> Não sei como vc está fazendo mas, na requisição têm duas formas de ser
> chamado usando chamadas inline( via helpers - remote_form_for,
> link_to_remote - ou usando os eventos dentro de suas tags html) ou usando
> não obstrusivo( dentro do header vc faz a chamada ajax - js puro).
>
> Quando você usa requisições inline a resposta esperada será sempre no
> formato js por padrão.
> Quando você usa não obstrusivo você tem que especificar qual resposta você
> está esperando(json, js, text, xml, etc)
>
> No controller que responde a chamada.
>
> Você pode usar o método *respond_to* caso queria especificar alguma coisa
> diferente para cada formato mas, por padrão ele chama automaticamente o
> formato js para os pedidos realizados via *link_to_remote *ou *
> remote_form_for*.
>
> respond_to do |format|
>   format.html {} # responde para pedidos de link_to ou form_for
>
>   format.js {} # responde para pedidos link_to_remote ou remote_form_for
> end
>
> Para usar o rjs basta você criar o arquivo:
> app/views/controller_name/metodo.rjs
>
> para testar a reposta pode usar no arquivo rjs
>
> page << "alert('esse eh um teste')"
>
> Talvez eu tenha clariado aí sua dúvida. Provavelmente nesse helper que você
> criou você não está fazendo a chamada ao método correspondente. Cola o
> código aí que nós debugamos pra vc.
>
> 2009/12/15 Felix <felix.raf...@gmail.com>
> > <rails-br%2Bunsu...@googlegroups.com<rails-br%252Buns...@googlegroups.com>

Marcio Aun Migueis

unread,
Dec 16, 2009, 5:00:39 AM12/16/09
to rail...@googlegroups.com
Você já tentou chamar o arquivo somente de update.rjs ( sem o js ) ?

2009/12/16 Felix <felix....@gmail.com>
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.

Márcio

unread,
Dec 16, 2009, 5:32:35 AM12/16/09
to rail...@googlegroups.com
Opa!

Crie um metodo, pois o método update (acho que esta usando os metodos do scaffold né?) quando salva ele te redireciona,
ai seu arquivo não é executado.
Vc teria que ter um método que salva/atualiza e te devolve a listagem atualizada novamente, sacou?

No caso de novos registros vc nem precisaria recarregar a listagem novamente, poderia fazer algo como:

def save
  @task = Task.new(params[:task])
  @task.save
end

Ai no save.js.rjs vc poderia usar algo assim:

if @task.save
  sua logica
end

Veja que checo se @task foi salva, se sim vc pode recuperar os dados (@task.id, @task.name) no próprio rjs e criar sua logica como preferir.



Abraço!


Márcio Gasparotto
http://www.diretoefacil.com.br


2009/12/16 Marcio Aun Migueis <marc...@gmail.com>

Felix

unread,
Dec 16, 2009, 2:14:26 PM12/16/09
to rails-br
Vou testar isso ai então, mas eu não uso o scaffold :), prefiro criar
só o que vou utilizar, assim que testar isso eu aviso se deu boa ou
não.

Obrigado pela ajuda a todos que responderam.

att
Rafael Felix

On 16 dez, 08:32, Márcio <mgasparo...@gmail.com> wrote:
> Opa!
>
> Crie um metodo, pois o método update (acho que esta usando os metodos do
> scaffold né?) quando salva ele te redireciona,
> ai seu arquivo não é executado.
> Vc teria que ter um método que salva/atualiza e te devolve a listagem
> atualizada novamente, sacou?
>
> No caso de novos registros vc nem precisaria recarregar a listagem
> novamente, poderia fazer algo como:
>
> def save
>   @task = Task.new(params[:task])
>   @task.save
> end
>
> Ai no save.js.rjs vc poderia usar algo assim:
>
> if @task.save
>   sua logica
> end
>
> Veja que checo se @task foi salva, se sim vc pode recuperar os dados (@
> task.id, @task.name) no próprio rjs e criar sua logica como preferir.
>
> Abraço!
>
> Márcio Gasparottohttp://www.diretoefacil.com.br
>
> 2009/12/16 Marcio Aun Migueis <marci...@gmail.com>
>
> > Você já tentou chamar o arquivo somente de update.rjs ( sem o js ) ?
>
> > 2009/12/16 Felix <felix.raf...@gmail.com>
> >> > > <rails-br%2Bunsu...@googlegroups.com<rails-br%252Buns...@googlegroups.com>
> >> <rails-br%252Buns...@googlegroups.com<rails-br%25252Bun...@googlegroups.com>

Felix

unread,
Dec 18, 2009, 4:29:47 AM12/18/09
to rails-br
Bah, não rolo, continua com o mesmo problema.

Olhem o seguinte codigo

Class TesteController

def update_data
end

criei o arquivo update_data.rjs
page << "alert('hello world')"

e no form redirecionei para essa action

usando a rota
teste/:id/update_data

e a saida no FireFox é uma página em branco com o conteudo:

try {
alert('hello world')
} catch (e) { alert('RJS error:\n\n' + e.toString()); alert('alert
(\'hello world\')'); throw e }

Realmente não sei o que fazer, estou pensando seriamente em usar o
proprio JQuery pra enviar a requisição.

Se alguem tiver alguma outra ideia eu agradeceria.

att

Frederico Macedo

unread,
Dec 18, 2009, 5:59:58 AM12/18/09
to rail...@googlegroups.com

Colega está faltando so vc incluir os javascripts na sua view, dentro do cabeçalho
na sua view coloca
<head>
<%= javascript_include_tag :defaults %>
</head>
2009/12/18 Felix <felix....@gmail.com>
Para cancelar a inscrição nesse grupo, envie um e-mail para rails-br+u...@googlegroups.com.

Felix

unread,
Dec 30, 2009, 4:43:04 AM12/30/09
to rails-br
Não está faltando não.

Será que pode ser algum conflito do prototype com o JQuery?

On 18 dez, 08:59, Frederico Macedo <xanth...@gmail.com> wrote:
> Colega está faltando so vc incluir os javascripts na sua view, dentro do
> cabeçalho
> na sua view coloca
> <head>
> <%= javascript_include_tag :defaults %>
> </head>

> 2009/12/18 Felix <felix.raf...@gmail.com>

> > > > >> > > <rails-br%2Bunsu...@googlegroups.com<rails-br%252Buns...@googlegroups.com>
> > <rails-br%252Buns...@googlegroups.com<rails-br%25252Bun...@googlegroups.com>
>
> > > > >> <rails-br%252Buns...@googlegroups.com<rails-br%25252Bun...@googlegroups.com>
> > <rails-br%25252Bun...@googlegroups.com<rails-br%2525252Bu...@googlegroups.com>


>
> > > > >> > > > > > .
> > > > >> > > > > > Para obter mais opções, visite esse grupo em
> > > > >> > > > > >http://groups.google.com/group/rails-br?hl=pt-BR.
>
> > > > >> > > --
>
> > > > >> > > Você está recebendo esta mensagem porque se inscreveu no grupo
> > > > >> "rails-br"
> > > > >> > > dos Grupos do Google.
> > > > >> > > Para postar neste grupo, envie um e-mail para
> > > > >> rail...@googlegroups.com.
> > > > >> > > Para cancelar a inscrição nesse grupo, envie um e-mail para
> > > > >> > > rails-br+u...@googlegroups.com<rails-br%2Bunsu...@googlegroups.com>
> > <rails-br%2Bunsu...@googlegroups.com<rails-br%252Buns...@googlegroups.com>
>

> > > > >> <rails-br%2Bunsu...@googlegroups.com<rails-br%252Buns...@googlegroups.com>
>
> ...
>
> mais »

Felix

unread,
Dec 31, 2009, 4:52:49 AM12/31/09
to rails-br
Galera, consegui fazer o negocio funciona, foi so adicionar o JRails
como plugin.

Devia ser algum conflito do Proptotype com o JQuery.

> ...
>
> mais »

Reply all
Reply to author
Forward
0 new messages