Почему этот частичный рендеринг не выполняется с помощью UJS / jQuery? - PullRequest
1 голос
/ 09 сентября 2010

Я пытаюсь использовать jQuery для создания сообщений с формой в моем проекте Rails 3.Вот что у меня есть:

смотрите обновленные результаты ниже

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

Когда я отправляю форму сообщения, она помещает текст, такой как #{render(:partial => 'posts')}, где должен быть пост ajax.: при изменении create.js.erb на:

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

я получаю эту ошибку в терминале при отправке формы:

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)

1 Ответ

2 голосов
/ 09 сентября 2010

вам не хватает тега erb:

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

Похоже, что вы снова пытаетесь отобразить полный набор сообщений, и я предполагаю, что вы действительно хотите отобразить одно сообщение. Это приведет к дублированию сообщений. В вашем методе создания не было задано ни одной переменной @posts, что привело к ошибке nil. Вы должны создать еще один фрагмент с именем _post и создать там один пост. Обратите внимание, что метод create устанавливает @post, но не @posts. Вот откуда ваша ошибка, потому что @posts равен нулю. Эта ошибка немного вводит в заблуждение, поскольку вы используете:

for post in @posts

Я бы порекомендовал использовать следующий синтаксис, который более широко используется в Ruby (который имеет тот же эффект, что и «для»):

@posts.each do |post|

Я думаю, что этот Railscast может вам помочь. Исходя из того, что вы здесь показываете, я думаю, что Райан делает почти то же самое, но использует метод опроса вместо отправки формы. Обратите особое внимание на ту часть, где он создает _comment.html.erb для отображения одного комментария.

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

...