Эффект «Показать / скрыть форму» с помощью помощников-прототипов Rail - PullRequest
0 голосов
/ 20 августа 2009

Я пытаюсь создать систему многопоточных комментариев, которая будет вести себя как Reddit: я нажимаю «Ответить» в комментарии, появляется форма. Эта форма имеет кнопку «Отмена», которая удаляет форму, возвращаясь к исходному состоянию.

Я пытаюсь добиться этого с помощью одного link_to_function, который добавляет форму, а сама форма имеет button_to_function для удаления себя и формы. Поэтому javascript, сгенерированный link_to_function, должен был экранировать HTML с экранированным javascript, и по какой-то причине он не работает (нажатие кнопки «Ответить» ничего не делает). Это работает нормально, если я не добавлю кнопку «Отмена». Вот что у меня есть:

<!-- comments/_comment.html.erb -->
<div id="comment_<%= comment.id %>">
  <%= h comment.content %>
</div>

<div id="reply_comment_<%= comment.id %>"></div>

<%= link_to_function 'Reply' do |page|
      page.replace_html "reply_comment_#{comment.id}",
        render(:partial => 'comments/form', :locals => {:comment => comment,
               :commentable => comment.commentable})
    end
%>

и

<!-- comments/_form.html.erb -->
<% form_tag(comments_path) do %>
  <%= hidden_field_tag 'comment[parent_id]', comment && comment.id %>
  <%= hidden_field_tag 'comment[commentable_id]', commentable.id %>
  <p>
    <%= text_area_tag 'comment[content]' %>
  </p>
  <p>
    <%= submit_tag 'Send' %>
    <% if comment %>
      <%= button_to_function 'Cancel' do |page|
            page.replace_html "reply_comment_#{comment.id}", ''
      end
       %>
    <% end %>

  </p>
<% end %>

Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 20 августа 2009

Я не совсем уверен, почему то, что вы делаете, не работает, но вот альтернативный способ сделать то, что вы пытаетесь сделать. Вместо того, чтобы вставлять и удалять текст внутри DIV, вы можете просто сделать Show / Hide для этого элемента (я удалил материал формы, но формат примерно такой же):

<!-- comments/_form.html.erb -->
   <%= button_to_function 'Cancel', "$('reply_comment_blah').hide()" %>
</p>

<!-- comments/_comment.html.erb -->
<div id="comment_blah">
  Hello!
</div>

<div id="reply_comment_blah", style="display: none;"><%= render :partial => 'form' %></div>

<%= link_to_function 'Reply' , "$('reply_comment_blah').show()" %>
0 голосов
/ 20 августа 2009

Хотя технически это возможно сделать точно так, как вы указали, я думаю, что в кодировке есть ошибка, потому что у вас есть JavaScript в JavaScript. Я уверен, что где-то есть шутка Йо Дауг. Второй бит внутреннего JavaScript, вероятно, не указан правильно.

Что вы можете сделать вместо использования функции replace_html - просто установить частичную настройку на скрытый, а затем выключить и снова включить видимость.

В качестве альтернативы вы можете попытаться исправить кодировку любыми необходимыми средствами.

Я просто полагаю здесь. Если бы вы могли опубликовать вывод этого, было бы легче сказать наверняка.

...