Хотите оценивать оператор if каждый раз, когда вызывается AJAX-вызов для создания комментария_титлов - PullRequest
0 голосов
/ 07 апреля 2011

В моем видеопоказе есть оператор if:

<% if @video.user == current_user && current_user != nil && @video.comment_titles.count < 3 %>
    <%= link_to "Add Comment Title", "#", :id => "comment_title_link", :class => "edit" %>
    <%= simple_form_for @video, :remote => true do |f| %>
     <%= f.input :comment_title_names, :label => false, :placeholder => "Add a Comments Title" %>
      <%= f.button :submit, :value => 'Add', :id => 'add_comment_title' %>
      <div class='hint'>Let your listeners know what comments you want by adding a guiding title for them. Pose a question, ask for feedback, or anything else!</div>
    <% end %>
<% elsif @video.comment_titles.count == 3 && @video.user == current_user && current_user != nil  %>
    <p> You have reached your limit of comment titles. You can always add a new one by deleting one of your old ones. </p>
<% end %>

Этот оператор if по существу оценивает @video.comment_titles.count, чтобы определить, является ли оператор if или оператор elsif истинным.Я позволил пользователям добавлять comment_titles с помощью ajax, и поэтому к моменту, когда значение @video.comment_titles.count == 3 равно true, оно не будет правильно оценивать оператор if, поскольку оператор if, который находится в моем видеопоказе, вызывается только после перезагрузки страницы.

Я хочу, чтобы оператор if вызывался динамически каждый раз, когда изменяется число comment_titles, что эквивалентно высказыванию всякий раз, когда вызывается вызов AJAX для обновления comment_titles.Однако я предпочел бы сделать это на стороне клиента, чем делать это в файле .js.erb.Как бы я запустил это на стороне клиента?

ОК, так что никто не ответил, поэтому я предполагаю, что либо я не предоставил достаточно кода, мне не ясно, что я пытаюсь сделать, илиэто невозможно.Что это?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2011

После прочтения вашего вопроса с учетом вашего комментария я предполагаю, что

  • Для события «добавлен новый заголовок комментария» существует обработчик событий javascript.
  • Предоставленный фрагмент находится в контейнере, например, <div id="add_comment_title_action">fragment</div>
  • Фрагмент должен обновляться каждый раз, когда выполняется обработчик события
  • Вы видели, что можно загрузить фрагмент с помощью $('#add_comment_title_action').load('fragment_url'), но вы просто делаете это в клиенте

Предположим, что обработчик событий выглядит примерно так:

$('#add_comment_title_form').submit(function(e) {
   e.preventDefault();
   $.post( 'url',
          { 'title': 'Lorem ispum dolor sit amet'}
   );
   updateFragment();       
});

Тогда у вас может быть функция для обновления фрагмента

updateFragment() {
  // Let's assume that @video.user == current_user && !current_user.nil?
  if($('.comment_title').size() < 3) {
     // NOP add something here to handle case when a title is deleted
  } else {
     $('#add_comment_title_action').html('<p> You have reached your limit of comment titles. You can always add a new one by deleting one of your old ones. </p>'); 
  }
}

Как сделать код лучше:

  • Должен быть какой-то обратный вызов, чтобы проверить, был ли успешным почтовый запрос, и продолжить соответственно
  • Вы можете обрабатывать два разных состояния фрагмента, просто скрывая и показывая опции в зависимости от состояния (если вы можете предположить, что все пользователи включили javascript и css)
  • Если вы решите заменить фрагмент на .html(...), тогда обработчики событий для элементов внутри фрагмента должны быть связаны с .live(event, handler), чтобы вы могли включить добавление новых заголовков комментариев после того, как удаление было выполнено

Обратите внимание, что каждая проверка, выполняемая на стороне клиента, должна выполняться и на стороне сервера.

Смотрите историю для совершенно другого ответа :)

0 голосов
/ 07 апреля 2011

Теперь я понимаю, что вы имеете в виду. Вы всегда должны синхронизировать свой веб-интерфейс со своим бэкэндом, поэтому я предлагаю вам сделать запрос ajax при отправке комментария. Ваш запрос должен возвращать true или false, если пользователь может комментировать, и если он может, опубликовать его и перезагрузить этот фрагмент. Я не фанат или rjs (которым вы, похоже, пользуетесь), поэтому я бы не знал синтаксис, но если бы это был jquery, я мог бы дать вам более подробный ответ.

во всяком случае, я сделаю это в пунктах пули

  • пользователь отправляет форму через ajax

    $ ("# add_comment_title"). Click (function () { $ .Ajax ({ тип: 'POST', data: $ ("# formwhothing"). serialize (), complete: function (html) { $ ( "# Divthatcontainsthatwholeifstatement") ReplaceWith (HTML). } }) })

  • серверная часть проверяет, достаточно ли уже сообщений у пользователя. если false, верните false в браузер. если true, добавьте в БД и сделайте частичный

    в вашем контроллере:

    def create #pseudo код, так как я тоже работаю лол если user.comments.size <3 # оставьте комментарий конец </p>

    @ comments = обновленные комментарии

    response_to do | форматировать | format.js {render: part => "partialthatcontainsthatif"} конец

    конец

  • ???
  • PROFIT

это "обновляет" частичное, несмотря ни на что. если у пользователя уже было более 3 комментариев, он вернется и покажет, что у вас есть проверка ошибок

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