2008-10-21 9 views
13

Quelqu'un at-il obtenu le plugin jquery jeditable pour fonctionner correctement dans une application Rails. Si oui, pourriez-vous partager quelques conseils sur la façon de le configurer? J'ai quelques problèmes avec la création de "submit-url". IIRC, vous ne pouvez pas simplement appeler le code ruby ​​à partir de javascript (s'il vous plaît laissez-moi me tromper :-). Voulez-vous dire RJS ??? Cela ne se limite-t-il pas à Prototype? J'utilise jQuery.Ruby on Rails et jeditable (jquery)


MISE À JOUR:
euh ..... a demandé ce un certain temps et dans l'intervalle commuté à une autre solution. Mais l'IIRC mon problème principal était le suivant:

J'utilise les ressources RESTful. Alors disons que je dois modéliser un blog et avoir ainsi la ressource "posts". Si je veux éditer un message (par exemple le message avec l'ID 8), ma mise à jour est envoyée via HTTP à l'adresse URL http://my.url.com/posts/8 avec le verbe HTTP POST. Cette URL est cependant construite dans mon code Rails. Alors, comment puis-je obtenir mon URL de soumission dans mon code jQuery? Comme il s'agit d'un code RESTful, mon URL de mise à jour change à chaque publication.

+0

Quels problèmes rencontrez-vous avec l'URL de soumission? – Codebeef

Répondre

5

Excusez-moi d'avoir soulevé cette seule, mais je viens de trouver le temps de regarder dans mon code. Je pense que je résolu mon problème par le javascript suivant (ma demande .js within rails):

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...' 
    }) 
}); 
}); 

Cela fonctionne, si vos URL de contrôleur sont RESTful.

+3

Comment sait-elle à quelle URL soumettre? – Angela

+0

L'URL de publication est la même que l'action de show, et la forme par défaut est la même URL si rien d'autre n'est spécifié. La différence est dans la méthode http et les rails l'acheminent en conséquence. – DGM

0

I "ne suis pas sûr que je comprends tout à fait le problème que vous rencontrez, mais je pense que vous pourriez mettre quelque chose comme ça dans votre javascript:

<%= url_for(@post) %> 

Cela dépend de vous structurer votre javascript, comment vous avez vos fichiers organisés etc ...

1

Si vous incluez des fichiers .js dans votre fichier html, alors non, mais si vous avez js inline dans votre template, alors oui vous pouvez.

Vous pouvez également avoir des fichiers .erb.js, qui sont des vues js.

Tout est possible: D

+0

En ce qui concerne ces fichiers .erb.js, cela vous dérangerait-il de jeter un oeil à mon autre article? Je l'apprécierais vraiment! http://stackoverflow.com/questions/260476/rails-how-to-update-a-hasmany-through-relation-via-jquery – Sebastian

10

Voici comment je câblé JEditable (1.6.2) avec mon repos application Rails (2.2.2):

forme Inline:

<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' 
    } 
}); 

Controller:

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 
%> 

Il est un peu maladroit avec cette instruction switch. Ce serait bien si JEditable sauvegardait simplement la valeur soumise par défaut si la requête ajax était réussie et que rien n'était retourné.

+1

Vous pouvez décompresser cette requête et retourner simplement ceci: format.js {render : text => @ email.send (params [: veut])} – jdl

0

Si vous êtes contrôleurs sont un peu moins de repos.En particulier, si vous avez une action pour mettre à jour un champ spécifique, cela fonctionne également. La clé transmet le jeton d'authentification.

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> 

contrôleur qui ne justifie En simplifiant pas d'être reposante:

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 

(Fonctionne avec Rails 2.2 .2 et 2.3.2 w/Jeditable 1.7.0 et jRails 0.4, bien que jRails ne joue pas beaucoup interaction son e autre que de fournir les includes pour jQuery 1.5)