Rails3 + jQuery: ответ Ajax испорчен - PullRequest
0 голосов
/ 11 мая 2011

Я пытаюсь ладить с Rails 3 и некоторой Ajaxification моего приложения с помощью jQuery.Поэтому, когда пользователь пишет комментарий, он должен быть вставлен через Ajax после нажатия кнопки отправки.

Проблема: Ответ Ajax содержит полный сгенерированный HTML-файл моего application.haml.Я понятия не имею, как избавиться от этого HTML и получить только предполагаемый ответ, записанный в соответствующем файле create.js.erb.

Вот мой контроллер комментариев:

class CommentsController < ApplicationController

  def new
    @comment = Comment.new
  end

  def create
    @article = Article.find(params[:article_id])
    @comment = current_user.comments.build(params[:comment])
    @comment.article_id = @article.id
    respond_to do |format|
      if @comment.save
        format.html
        format.js

      else
        format.html
        format.js
      end
    end
  end

end

Форма (в HAML) для комментариев выглядит следующим образом:

  #article_write_comment
    %h2 Write a comment
    #article_write_comment_form
      %p Comments are limited to 1000 chars.
      = form_for([@article, @article.comments.build], :remote => true) do |f|
        .field
          = f.text_area :body, :rows => 10, :cols => 50
        .actions
          = f.submit "Submit"

Мой файл create.js.erb размещен в представлениях / комментариях:

$('#article_comments').append('<%= escape_javascript(render(@comment)) %>');

Комментарий частично (views / comments / _comment.haml), который должен быть добавлен, выглядит следующим образом:

.comment
  = gravatar_for comment.user, :size => 48
  %p
    %b
      = comment.user.name
      said: 
    = time_ago_in_words(comment.created_at)
    ago
  %p
    = simple_format(comment.body)

Наконец, отправленное сообщение ajax после нажатия на кнопку отправки:

authenticity_token  e2rvcKyjPEx8f31U2vemxCGMfVJzxvqTO+03OCAsNkw=
comment[body]   Test Test Test
commit  Submit
utf8    ✓

Но вместо этоготакой ответ:

$('#article_comments').append('<%= escape_javascript(render(@comment)) %>');

Я получаю такой ответ с html-кодом сайта: (Сокращено содержание div'ов для меньшего отвлечения)

<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div id='content'>
      <div id='header'>
      </div>
      <div id='container'>
        $('#article_comments').append('<div class=\'comment\'>\n  <img alt=\"Alex Gieche\" class=\"gravatar\" src=\"http://gravatar.com/avatar/66d7f7aefd1f45ea810cb3f524cc1780?size=48\" />\n  <p>\n    <b>\n      Alex Gieche\n      said:\n    <\/b>\n    less than a minute\n    ago\n  <\/p>\n  <p>\n    <p>Test Test Test<\/p>\n  <\/p>\n<\/div>\n');
      </div>
      <div id='sidebar'>
      </div>
      <div id='footer'>
      </div>
    </div>
  </body>
</html>

Theкомментарий не добавляется в div (но записывается в базу данных).Итак, как я могу это исправить?Спасибо за внимание!

1 Ответ

0 голосов
/ 11 мая 2011

Хорошо, спасибо за поиск, я нашел решение. В контроллере комментариев мне пришлось добавить следующий хэш в format.js, чтобы предотвратить отображение макета в ответе:

class CommentsController < ApplicationController

  def new
    @comment = Comment.new
  end

  def create
    @article = Article.find(params[:article_id])
    @comment = current_user.comments.build(params[:comment])
    @comment.article_id = @article.id
    respond_to do |format|
      if @comment.save
        format.html
        format.js {render :layout=>false}
      else
        format.html
        format.js {render :layout=>false}
      end
    end
  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...