2010-09-09 10 views
1

J'essaie d'utiliser jQuery pour créer des messages avec un formulaire dans mon projet Rails 3. Voici ce que j'ai:Pourquoi ce rendu partiel avec UJS/jQuery n'est-il pas effectué?

Regardez ci-dessous pour les résultats mis à jour

create.js.erb:

$("#posts").prepend("#{render(:partial => 'posts')}"); 

layouts/application.html.erb:

... 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
<%= javascript_include_tag 'rails' %> 
<%= csrf_meta_tag %> 
... 

posts_controller. rb:

def create 
    @post = Post.new(params[:post]) 
    respond_to do |format| 
    if @post.save 
     # ... 
     format.js 
    else 
     # ... 
    end 
    end 
end 

Lorsque je soumets le formulaire de publication, il met un texte comme #{render(:partial => 'posts')} où le post ajax devrait être.

EDIT: en changeant create.js.erb à:

$("#posts").prepend("<%= render(:partial => 'posts')%>"); 

Je reçois cette erreur dans le terminal lorsque je soumets la forme:

Rendered posts/_posts.html.erb (13.6ms) 
Rendered posts/create.js.erb (80.4ms) 
Completed in 1631ms 

ActionView::Template::Error (You have a nil object when you didn't expect it! 
You might have expected an instance of Array. 
The error occurred while evaluating nil.each): 
    1: <%- for post in @posts -%> 
    2: <div class="post"> 
    3:  <%= link_to post.title, post %> 
    4:  <%- if post.name? -%> 
    app/views/posts/_posts.html.erb:1:in  `_app_views_posts__posts_html_erb___692646030_16112196__738457576' 
    app/views/posts/create.js.erb:1:in `_app_views_posts_create_js_erb__431255654_16166988__591965598' 
    app/controllers/posts_controller.rb:39:in `create' 

Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/_trace.erb (10.6ms) 
Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (54.3ms) 
Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/template_error.erb within rescues/layout (102.1ms) 

Répondre

2

vous manque la balise erb:

$("#posts").prepend("<%=render(:partial => 'posts')%>"); 

Il semble que vous essayez de rendre le jeu complet de po sts encore, et je suppose que vous voulez vraiment rendre un seul poste. Cela entraînerait la publication de messages en double. Aucune variable @posts n'a été définie dans votre méthode create résultant de cette erreur nulle. Vous devriez créer un autre partiel appelé _post et y afficher un seul post. Notez que la méthode create définit @post, mais pas @posts. C'est de là que vient votre erreur, car @posts est nul. L'erreur est un peu trompeur b/c que vous utilisez:

for post in @posts 

Je recommande d'utiliser la syntaxe suivante qui utilise plus largement dans Ruby (qui a le même effet que « pour »):

@posts.each do |post| 

Je pense que cette solution peut vous aider. Sur la base de ce que vous montrez ici, je pense que Ryan fait presque exactement la même chose, mais en utilisant une méthode d'interrogation au lieu de soumettre un formulaire. Portez une attention particulière à la partie où il crée _comment.html.erb pour rendre un seul commentaire.

http://railscasts.com/episodes/229-polling-for-changes

+1

Je reçois un ActionView :: Template :: Error avec ceci. J'ai posté le résultat dans ma question. – BasicObject

+0

ma réponse a été mise à jour. S'il vous plaît voir ci-dessus. – johnmcaliley