Загрузка дополнительных комментариев с использованием AJAX в Rails - PullRequest
3 голосов
/ 28 января 2010

В настоящее время я работаю над блогоподобным сайтом, используя Ruby on Rails. Каждый «пост» имеет несколько комментариев. В настоящее время у меня загружены только последние 5 комментариев, но я хочу добавить гиперссылку, которая бы загружала остальные комментарии. К сожалению, с моей текущей реализацией все, что я получаю, - это куча ненужных вещей.

До

Comments

Posted 7 minutes ago 
New

Posted 1 day ago 
Comment 3

Posted 1 day ago 
Comment 2

Posted 1 day ago 
Comment 1

Posted 1 day ago 
This is a new comment

View more comments

После клика «Показать больше комментариев»

Comments

try { Element.insert("comments", { bottom: "
\n
\n Posted 1 day ago\n 
\n Comment 2\n

\n
" }); Element.insert("comments", { bottom: "
\n
\n Posted 1 day ago\n 
\n Comment 3\n

\n
" }); Element.insert("comments", { bottom: "
\n
\n Posted less than a minute ago\n 
\n New\n

\n
" }); Element.hide("morecomments"); } catch (e) { alert('RJS error:\n\n' + e.toString()); alert('Element.insert(\"comments\", { bottom: \"
\\n
\\n Posted 1 day ago\\n 
\\n Comment 2\\n

\\n
\" });\nElement.insert(\"comments\", { bottom: \"
\\n
\\n Posted 1 day ago\\n 
\\n Comment 3\\n

\\n
\" });\nElement.insert(\"comments\", { bottom: \"
\\n
\\n Posted less than a minute ago\\n 
\\n New\\n

\\n
\" });\nElement.hide(\"morecomments\");'); throw e }

В сообщении show.html.erb есть:

<div id="morecomments">
  <%= link_to_remote "View more comments", :url=>{:action=>'morecomments',:post_id=>@post.id},:update=>'comments' %>
</div>

В моем почтовом контроллере у меня есть

def morecomments
  @post = Post.find(params[:post_id])
  @comments = @post.comments.values_at(Range.new(5, @post.comments.size-1))
  respond_to do |format|
    format.html {redirect_to @post.comments}
    format.js
  end
end

И, наконец, мои morecomments.js.rjs:

@comments.each do |p|
  page.insert_html :bottom, :comments, :partial => p
end
page.hide 'morecomments'

Я действительно новичок в Rails, и я не знаю, как работают все мета-магические рельсы в фоновом режиме. Любая помощь будет потрясающей.

Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 января 2010

Ваша проблема в том, что вы смешиваете понятия. Вы можете выбрать link_to_remote с опцией: update или RJS. Не оба.

Когда вы используете link_to_remote с опцией: update, ваше представление ожидает получить фрагмент html, который заменит внутренний html элемента DOM, соответствующий идентификатору, предоставленному для: update. В вашем случае это комментарии div.

Ваш раздел формата .js отображает шаблон rjs, потому что вы не сказали ему делать что-то еще, и он генерирует javascript, который link_to_remote обрабатывает как html, который использует его для замены div комментариев.

У вас есть два решения:

  1. Используйте link_to_remote с :update

    Ваш вид не меняется, а ваш файл rjs не используется. Для реализации этого исправления замените строку foramt.js в вашем контроллере на:

     format.js { render :partial => 'comments', :collection => @comments}
    
  2. Использовать RJS

    В этом решении ваш контроллер не меняется. все, что вам нужно сделать, это удалить , :update =>'comments' из вашего link_to_remote вызова.

0 голосов
/ 28 января 2010

Проблема в том, что ваше действие morecomments просто возвращает javascript и внедряет его в конец страницы.

Когда вы вызываете действие, которое отвечает на расширение .js, вы получаете обратно javascript. Это полезно, если вам нужно создать динамический JavaScript, но на самом деле это не так. Сделайте, чтобы это действие возвратило файл json и использовало некоторый javascript во внешнем интерфейсе, который его интерпретирует и внедряет. Или вы можете вставить то, что уже возвращается в теги скрипта, и это (должно) сработать.

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