0

Я создаю основное приложение для досок объявлений с Rails 3. Я хочу, чтобы сообщения создавались с помощью UJS/jQuery (отправляйте сообщение с помощью AJAX и очистите форму). Я думал, что это было бы просто, но я получаю эту ошибку:Простые UJS с jQuery, не работающие в Rails 3

Rendered posts/create.js.erb (64.5ms) 
Completed in 1771ms 

ActionView::Template::Error (undefined local variable or method `posts' for #<#<Class:0x1d681d0>:0x1d66f10>): 
    1: $("#posts").html("<%= escape_javascript(render(:partial => posts)) %>"); 
    2: $("#form").html("<%= escape_javascript(render 'form') %>"); 
    app/views/posts/create.js.erb:1:in `_app_views_posts_create_js_erb__431255654_15413772__591965598' 
    app/controllers/posts_controller.rb:41: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.5ms) 
Rendered /usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (53.8ms) 
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 (95.0ms) 

макеты/application.html.erb:

<!DOCTYPE html> 
<html> 
    <head> 
    <title><%= @title || controller.action_name %></title> 
    <%= stylesheet_link_tag 'style' %> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
    <%= javascript_include_tag 'jquery.timeago','jquery.watermark', 'rails' %> 
    <%= csrf_meta_tag %> 
    </head> 
    <body> 
    <container> 
     <%= render "shared/nav" %> 
     <section id="content"> 
     <%- flash.each do |name, msg| -%> 
      <%= content_tag :div, msg, :id => "flash_#{name}" %> 
     <%- end -%> 
     <%= yield %> 
     </section> 
     <%= render "shared/footer" %> 
    </container> 
    </body> 
</html> 

сообщений/index.html.erb:

<div id="posts"> 
    <%= render 'posts' %> 
</div> 
<%= will_paginate @posts, :previous_label => "previous", :next_label => "next" %> 
<div id="form"> 
    <%= render 'form' %> 
</div> 

сообщений/_posts.html.erb:

<%- for post in @posts -%> 
    ... 
<%- end -%> 

сообщений/_form.html.e гь:

<%= form_for :post, :remote => true, :url => { :controller => :posts, :action => "create" } do |f| %> 

    <%= f.label :title, "title" %> 
    <%= f.text_field :title, :placeholder => "title" %> 

    <%= f.label :content, "message" %> 
    <%= f.text_area :content, :placeholder => "message" %> 

    <%= f.submit 'post' %> 

<% end %> 

сообщений/create.js.erb:

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

posts_controller.rb:

class PostsController < ApplicationController 
    before_filter :find_post, :only => [:show, :edit, :update, :destroy] 
    respond_to :html, :js 

    def index 
    @title = "chat" 
    @posts = Post.paginate :page => params[:page], :order => "updated_at DESC" 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

    # ... 

    def new 
    @post = Post.new 
    respond_to do |format| 
     format.html 
     format.js 
    end 
    end 

    def create 
    @post = Post.new(params[:post]) 
    respond_to do |format| 
     if @post.save 
     flash[:notice] = "Created \"#{@post.title}\"" 
     format.html { redirect_to(posts_url) } 
     format.js 
      else 
     flash[:error] = "Title, tag and message required" 
     format.html { redirect_to(posts_url) } 
     format.js 
     end 
    end 
    end 

    # ... 

    private 

    def find_post 
    @post = Post.find(params[:id]) 
    @comments = @post.comments 
    end 
end 

Я использую Rails 3.0.0 и Ruby, 1.9.2. Не знаю, в чем проблема.

ответ

4

в posts/create.js.erb

$("#posts").html("<%= escape_javascript(render(:partial => posts)) %>"); 

должен быть:

$("#posts").html("<%= escape_javascript(render "posts") %>"); 

Там нет определения для сообщений, так что если вы даете ему строку, он будет оценивать частичные сообщения/_posts.html.erb

Кроме того, для использования jQuery вместо прототипа в рельсах 3 приложения, jquery-rails является удивительным.

+0

Спасибо тонну! Я не использовал 'escape_javascript', и JS не исполнялся! – Zabba

0

Просто убедитесь, что вы установили jQuery UJS вещи прямо? Я полагаю, вы это сделали, так как вы отметили это как таковое, но вы не упомянули об этом в своем посте. Опять же, просто убедившись!

+0

Это то, что '' rails'' находится в 'application.html.erb' – BasicObject

+0

Я вручную загружаю файл из github и вставляю его в каталог javascripts. – BasicObject

+0

Вы следуете инструкциям, указанным здесь? http://github.com/rails/jquery-ujs/blob/master/README.rdoc –

Смежные вопросы