2008-10-21 24 views
13

Alguien ha recibido el plugin jquery jeditable para que se ejecute correctamente en las aplicaciones de Rails. Si es así, ¿podría compartir algunas sugerencias sobre cómo configurarlo? Tengo problemas para crear la "URL de envío".Ruby on Rails y jeditable (jquery)


IIRC, no puedes simplemente llamar al código de ruby ​​desde javascript (por favor, déjame estar equivocado :-). ¿Te refieres a RJS? ¿No está eso limitado a Prototype? Estoy usando jQuery.


ACTUALIZACIÓN:
eh ..... hizo esta hace un tiempo y, mientras tanto, cambió a una solución diferente. Pero IIRC mi problema principal fue el siguiente:

Estoy utilizando los recursos RESTful. Entonces digamos que tengo que modelar un blog y así tener el recurso "publicaciones". Si deseo editar una publicación (por ejemplo, la publicación con ID 8), mi actualización se envía a través de HTTP a la URL http://my.url.com/posts/8 con el verbo HTTP POST. Sin embargo, esta URL está construida en mi código Rails. Entonces, ¿cómo obtendría mi URL de envío en mi código jQuery? Como este es un código RESTful, mi URL de actualización cambiará con cada publicación.

+0

¿Qué problemas tiene con la URL de envío? – Codebeef

Respuesta

5

Disculpe por mencionar esto solo ahora, pero encontré el momento de buscar en mi código nuevamente. Creo que resolví mi problema con el siguiente javascript (mi aplicación .js dentro de raíles):

jQuery(document).ready(function($) { 

$(".edit_textfield").each(function(i) { 
    $(this).editable("update", { 
     type  : 'textarea', 
     rows  : 8, 
     name : $(this).attr('name'), 
     cancel : 'Cancel', 
     submit : 'OK', 
     indicator : "<img src='../images/spinner.gif' />", 
     tooltip : 'Double-click to edit...' 
    }) 
}); 
}); 

Esto funciona, si las URL de su controlador son RESTful.

+3

¿cómo sabe a qué URL enviar? – Angela

+0

la url de la publicación resulta ser la misma que la acción de mostrar, y forma predeterminada la misma url si no se especifica nada más. La diferencia está en el método http, y los rieles lo encaminan en consecuencia. – DGM

0

I "m no estoy seguro de entender del todo el problema que tienes, pero creo que se podría poner algo como esto en su javascript:

<%= url_for(@post) %> 

Depende cómo se está estructurando su Javascript, cómo tiene organizados sus archivos, etc. ...

1

Si incluye archivos .js en su html, entonces no, pero si tiene js en línea en su plantilla de visualización, entonces sí puede hacerlo.

También puede tener archivos .erb.js, que son vistas js.

Cualquier cosa es posible: D

+0

Con respecto a esos archivos .erb.js, ¿te importaría echar un vistazo a mi otra publicación? ¡Realmente lo apreciaría! http://stackoverflow.com/questions/260476/rails-how-to-update-a-hasmany-through-relation-via-jquery – Sebastian

10

Así es como me conecté JEditable (1.6.2) con mi aplicación Rails reparador (2.2.2):

formulario en línea:

<div id="email_name"><%= h(@email.name) %></div> 

$('#email_name').editable(<%= email_path(@email).to_json %>, { 
    name: 'email[name]', 
    method: 'PUT', 
    submitdata: { 
    authenticity_token: <%= form_authenticity_token.to_json %>, 
    wants: 'name' 
    } 
}); 

controlador:

def update 
    @email = Email.find(params[:id]) 
    @email.update_attributes!(params[:email) 
    respond_to do |format| 
    format.js 
    end 
end 

update.js.erb

<%= 
    case params[:wants] 
    when 'name' then h(@email.name) 
    # add other attributes if you have more inline forms for this model 
    else '' 
    end 
%> 

que es un poco torpe con esa sentencia switch. Sería bueno si JEditable simplemente guardara el valor enviado por defecto si la solicitud de ajax fuera exitosa y no se devolviera nada.

+1

Puede descifrar esa declaración de caso y simplemente devolver esto: format.js {render : text => @ email.send (params [: quiere])} – jdl

0

Si sus controladores son un poco menos de descanso.Particularmente si tiene una acción para actualizar un campo específico, entonces esto también funciona. La clave es pasar el token de autenticación.

index.html.erb

<span id="my_edit"><%= foo.bar %></span> 

<script type="text/javascript"> 
    $(document).ready(function() { 
    $("#my_edit").editable('<%= url_for(:action => "update_bar", 
        :id => foo) %>', 
        { 
         method: 'PUT', 
         cancel : 'Cancel', 
         submit : 'OK', 
         indicator : "<img src='../images/spinner.gif' />", 
         tooltip : 'Double-click to edit...', 
         submitdata: { 
         authenticity_token: <%= form_authenticity_token.to_json %>, 
         } 
        } 
    }); 
</script> 

controlador simplificado en exceso que no justifica no ser reparador:

foo_controller.rb

def update_bar 
    foo = Foo.find(params[:id]) 
    bar= params[:value] 
      // insert justifiable code here 
    foo.save 
    render :text=>params[:value] 
end 

(trabaja con Rails 2.2 .2 y 2.3.2 con Jeditable 1.7.0 y jRails 0.4, aunque jRails no juega mucha interacción con ella e aparte de proporcionar las inclusiones para jQuery 1.5)