Responds_to_parent error

Hola

Estoy intentando subir una imagen y refrecar la capa con
responds_to_parent. Tengo este formulario

rhtml

<% form_for(photo, :url => {:action => “create”, :tID => params[:tID] },
:html => { :multipart => true, :target => “uploadFrame”, :id =>
‘uploadPhotoForm’ }) do |f| -%>

<%= image_submit_tag ("../images/ok.gif") %> <% end -%>

Y en el controllador

def create
@photo = Photo.new(params[:photo])
if @photo.save
responds_to_parent do
render :update do |page|
if @success
page.form.reset ‘uploadPhotoForm’
else
page.alert “Photo upload didn’t work! Sorry!”
end
end
end
end
end

Error en log

NoMethodError (undefined method `responds_to_parent’ for
#PhotosController:0x48b4454):

Tengo copiado no instalado, pq no lo encontré para instalarlo en la
vendor/plugins/responds_to_parent y vendor/plugins/remote_upload

Le he incluido esto js

Alguien sabe pq no me encuentra el responds_to_parent?? Por favor no se q más mirar. El proyecto lo tenía q entregar ayer y no consigo q funcione.... Muchas gracias

Ahora mismo el error que me está dando firefox es:

window.parent.handleResponse is not a function
evalScript()

Cuando ejecuta:

      responds_to_parent do
        render :update do |page|
          if @success
            page.form.reset 'uploadPhotoForm'
          else
            page.alert "Photo upload didn't work!  Sorry!"
          end
        end
      end

Sabeis porqúe?

Muchas gracias

Davicín … wrote:

Error en log

NoMethodError (undefined method `responds_to_parent’ for
#PhotosController:0x48b4454):

Tienes instalado el plugin “Responds to Parent” ? [1]

[1] http://agilewebdevelopment.com/plugins/responds_to_parent

Espero te sirva.

Jaime Mora R.

Tienes instalado el plugin “Responds to Parent” ? [1]

Sí lo tengo instalado. Pero despues de hacer el insert en la tabla de
las fotos se me sale siempre por el error…

      responds_to_parent do
        render :update do |page|
          if @success
            page.form.reset 'uploadPhotoForm'
          else
            page.alert "Photo upload didn't work!  Sorry!"
          end
        end
      end

Siempre muestra -> alert “Photo upload didn’t work! Sorry!”

Y no se como actualizar la capa ajax…

Muchas gracias

Davicín … wrote:

Siempre muestra -> alert “Photo upload didn’t work! Sorry!”

Donde se define @success ? Puedes postear más código ?


Jaime Mora R.

Donde se define @success ? Puedes postear más código ?

Pues tienes razón no lo tenía definido en ningún sitio. Lo copié de una
web…

Lo tengo puesto así ahora mismo:

def create
@photo = Photo.new(params[:photo])
if @photo.save
responds_to_parent do
render :update do |page|
page.form.reset ‘uploadPhotoForm’
end
end
end
end

El rhtml es

<% form_for(photo, :url => {:action => “create”, :tID => params[:tID] },
:html => { :multipart => true, :target => “uploadFrame”, :id =>
‘uploadPhotoForm’ }) do |f| -%>

<%= image_submit_tag ("../images/ok.gif") %> <% end -%>

Y despues de quitar el @success me da el siguiente error firefox:

window.parent.handleResponse is not a function
evalScript()create (line 4)
[Break on this error] window.parent.handleResponse(document,'try
{\nForm.reset("uploadP…

Y da en el iframe…

Sabes por q se puede producir el error??

Muchisimas gracias

Davicín … wrote:

Si quisiera actualizar la capa ajax entera cómo se podría hacer desde el
controlador mándandole parámetros. Pq con esa solución me valdría.

Entiendo que necesitas actualizar algunos elementos del DOM, mediante
una llamada Ajax. En estos momentos comprender bien el Rails
JavaScriptGenerator (RJS), te hará bien. Te dejó unos links :

— En el API —
http://api.rubyonrails.org/classes/ActionView/Helpers/PrototypeHelper/JavaScriptGenerator/GeneratorMethods.html

— AJAX con RJS —

— RJS Tips —

— cheat sheet —

— Gran lista de recursos —
http://www.rubyinside.com/16-rjs-resources-and-tutorials-for-rails-programmers-5.html

Espero te sirva.

Jaime Mora R.

Si quisiera actualizar la capa ajax entera cómo se podría hacer desde el
controlador mándandole parámetros. Pq con esa solución me valdría.

Pq lo he intentado así. Pero ‘main_content’ es una capa y no un
formulario y no puedo poner el page.form.reset.

responds_to_parent do
render :update do |page|
page.form.reset :update => ‘main_content’, :url => {:action =>
:list, :opMenu => params[:opMenu], :templateID => params[:templateID]}
end
end

Muchísimas gracias

PD: Ando un poco desesperado

Muchas gracias por la información Jaime.

La verdad que estoy un poco sorprendido. Porque lo único que tengo que
hacer es subir un fichero con attachment_fu y recargar la capa ajax para
que me visualice la imagen nueva…

Y la primera parte está hecha. Pero el simple hecho de recargar la capa
ajax desde el controlador parece bastante complejo.

Ahora mismo ando muy agobiado ya que el proyecto lo tenía q haber
entregado ayer y hoy a estas horas sigo sin tenerlo nada claro…

No se si me podrías ayudar con esto. Estaría dispuesto a pagar por el
trabajo.

Muchas gracias.

Hola Jaime.

Me he visto los screencasts y están muy interesantes.

He creado un create.rjs, pero no consigo que me salga un alert desde
él…
Mi código es este:

rhtml

<% form_for(photo, :url => {:action => “create”, :tID => params[:tID] },
:html => { :multipart => true, :target => “uploadFrame”, :id =>
‘uploadPhotoForm’ }) do |f| -%>

<%= image_submit_tag ("../images/ok.gif") %> <% end -%>

Este formulario no es un form_remote_for ya que es para subir archivos y
según me comentaron no se puede hacer con ajax. Así que tengo el iframe
para subir la foto. Y lo mando a la acción ‘create’ en la cual tengo el
siguiente código

controller

def create
@photo = Photo.new(params[:photo])
if @photo.save
render :action => ‘create.rjs’
end
end

create.rjs

page.alert(‘Hello’)

Log:

Rendering photos/create.rjs

Aparentemente pasa por el create.rjs pero no saca el alert.

Sin embargo si pongo un
<%=link_to_remote(“RJS”,:update=>“main_content”, :url
=>{:action=>“create”}) %>
me sale el alert y seguido se me muestra en la pantalla
try { alert(“Hello”); } catch (e) { alert(‘RJS error:\n\n’ +
e.toString()); alert(‘alert(“Hello”);’); throw e }

Cual es el error hasta aquí?? Porqué no me sale el alert??

Muchas gracias

Davicín … wrote:

Muchas gracias por la información Jaime.

La verdad que estoy un poco sorprendido. Porque lo único que tengo que
hacer es subir un fichero con attachment_fu y recargar la capa ajax para
que me visualice la imagen nueva…

Primeramente te aconsejaría movieras la parte responsable de actualizar
los elementos DOM, a una plantilla RJS. Si tu controlador se llama
FotosController, y la acción se llama refresh, tu tendrías la siguiente
plantilla RJS:

#app/views/fotos/refresh.rjs

Hasta aqui no hay problema ?

Bien dentro de refresh.rjs, estás en el servidor y puedes accesar a las
variables de instancia creadas en la acción refresh de tu controlador,
puedes sustituir elementos de la página con page.replace_html por
ejemplo. Esto es maravillosos ya que estás generando JavaScript pero
dentro del servidor hacia el frente. Reemplazarías el elemento div de la
página, por ejemplo mediante un partial, en tu caso el elemento
“main_content” :

page.replace_html “main_content”, :partial => “show_foto”

Esta plantilla no se limita a una sola linea, puedes agregar filas de
código RJS. Bien prueba con esto, necesito salir a comer y regreso. En
esta lista existen gente de muy alto nivel, del cuál he aprendido mucho,
pero es importante que cuando plantees un problema pongas todo el código
que te sea posible y que esté involucrado, para poder ayudarte. Al menos
echale un vistazo a los screencasts, no te llevas más de 1 hora en
bajarlos y revisarlos. Seguiremos con esto …

Espero te sirva.
Saludos.

Jaime Mora R.

Davicín … wrote:

Me he visto los screencasts y están muy interesantes.

Creo haber encontrado la solución a tu problema. Sigue el procedimiento
y me cuentas [1]. Re-factoriza lo que tengas y ajustalo.

[1]
http://khamsouk.souvanlasy.com/2007/5/1/ajax-file-uploads-in-rails-using-attachment_fu-and-responds_to_parent

Espero te sirva.

Jaime Mora R.

Davicín … wrote:

http://khamsouk.souvanlasy.com/2007/5/1/ajax-file-uploads-in-rails-using-attachment_fu-and-responds_to_parent

Había encontrado esa web ahora mismo. Y estaba con ella.
Tengo una duda con ello. En la creación del formulario lo hace así:

Ya bajaste el ejemplo completo ? Es altamente recomendable que lo hagas,
para que tengas más claro el procedimiento. En ocasiones conviene
olvidarse de lo que uno tiene y empezar todo de nuevo. Puedes realizar
una prueba en otra aplicación y cuando lo tengas funcionando, lo
implementas en la aplicación definitiva.

Espero te sirva.
Saludos

Jaime Mora R.

Me he bajado el código de la página y no está con ajax ni el iframe.
Le he metido el iframe pero al no tener ajax estoy en la misma
situación…

Empiezo a estar muy desesperado. Te planteo seriamente el pagarte por
este trabajo.

Que te parece? Para mí sería un gran favor y salir de una situación muy
comprometida.

Muchas gracias.

http://khamsouk.souvanlasy.com/2007/5/1/ajax-file-uploads-in-rails-using-attachment_fu-and-responds_to_parent

Había encontrado esa web ahora mismo. Y estaba con ella.
Tengo una duda con ello. En la creación del formulario lo hace así:

<% form_for(:asset, :url =>formatted_assets_path(:format => ‘js’), :html
=> { :multipart => true, :target => ‘upload_frame’}) do |form| %>

Y la url “:url =>formatted_assets_path” Yo tengo puesto:

<% form_for(:photo, :url => {:action => “create”, :tID => params[:tID]
}, :html => { :multipart => true, :target => ‘upload_frame’}) do |form|
%>

URL mía: :url => {:action => “create”, :tID => params[:tID] }

Y en el controlador
def create
@photo = Photo.new( params[:photo])
respond_to do |format|
if @photo.save
flash[:errorlogo] = ‘Asset was successfully created.’
format.html {render :action =>‘list’,:opMen
=>params[:opMenu],:tID =>params[:tID]}
format.js do
responds_to_parent do
render :update do |page|
page.insert_html :bottom, “photo”, :partial =>
‘photo/list’,
:object => @photo, :opMenu => params[:opMenu], :tID =>
params[:tID]
page.visual_effect :highlight, “asset_#{@photo.id}”
end
end
end
end
end
end

Y ahora en el log:

ActionView::TemplateError (You have a nil object when you didn’t expect
it!
The error occurred while evaluating nil.current) on line #80 of
app/views/photos/list.rhtml:
77:


78:
79:

80: <%if @photo_pages.current.previous %>
81: <%= link_to_remote(“< Anterior”,
82: :update => “main_content”,
83: :url =>{:page => @photo_pages.current.previous, :opMenu =>
opcionMenu, :tID => params[:tID]},

Es como si no se le pasaran los parámetros con el page.insert_html.
Se los pongo así:
page.insert_html :bottom, “photo”, :partial => ‘photo/list’,
:object => @photo, :opMenu => params[:opMenu], :tID =>
params[:tID]
page.visual_effect :highlight, “asset_#{@photo.id}”

Es la forma correcta??

Muchísimas gracias

Davicín … wrote:

Me he bajado el código de la página y no está con ajax ni el iframe.
Le he metido el iframe pero al no tener ajax estoy en la misma
situación…

Bajé el ejemplo, lo adapté para MySql en database.yml, bajé la gema
mini_magick y está funcionando ok. Efectivamente como comentas varía,
sin embargo si observas en index.rhtml, se encuentra el iframe y además
observa que en el form_for, la :url se le agrega el “.js” para que
llegue a la accion create en formato js, revisando el development.log
podemos demostrar esto :

Parameters: {“commit”=>“Create”, “format”=>“js”, “action”=>“create”,
“controller”=>“assets”,
“asset”=>{“uploaded_data”=>#StringIO:0x461a20c}}

#index.rhtml

Listing assets

    <% @assets.each do |asset| %> <%= render(:partial => '/assets/list_item', :object => asset)%> <% end %>

<% form_for(:asset, :url => assets_path + “.js”, :html => { :multipart
=> true, :target => ‘upload_frame’}) do |form| %>
<%= render(:partial => ‘/assets/form’, :object => form) %>
<% end %>

#assets_controller.rb

class AssetsController < ApplicationController

def create
@asset = Asset.new(params[:asset])

respond_to do |format|
  if @asset.save
    flash[:notice] = 'Asset was successfully created.'
    format.html { redirect_to asset_url(@asset) }
    format.xml  { head :created, :location => asset_url(@asset) }
    format.js do
      responds_to_parent do
        render :update do |page|
          page.insert_html :bottom, "assets", :partial => 

‘assets/list_item’, :object => @asset
page.visual_effect :highlight, “asset_#{@asset.id}”
end
end
end
else
format.html { render :action => “new” }
format.xml { render :xml => @asset.errors.to_xml }
format.js
end
end
end
end

Una vez estando en la accion create actualiza los elementos de la página
utilizando RJS.

Espero te sirva.

Jaime Mora R.