Rails: замените форму "create" формой "edit" после запроса ajax - PullRequest
1 голос
/ 04 декабря 2010

Итак, вот моя проблема:

У меня есть приложение Rails 3 с фотографиями и пользователями.У пользователей есть много фотографий.Другие пользователи могут оценивать фотографии как "большие пальцы" или "большие пальцы".Существует модель голосования, которая обрабатывает это.У пользователей есть много голосов (по одному на фотографию), и у фотографий есть много голосов (по одному на пользователя), в двусторонней связи has_many: through.

Чтобы разрешить голосование большим пальцем вверх / вниз, у меня естьФорма, отправленная через ajax.Форма работает нормально, но я столкнулся с проблемой, которую я не совсем понимаю.

Когда пользователь впервые посещает фотографию, он еще не проголосовал ни большим, ни большим пальцами вверх,поэтому для этого пользователя нет объекта "голосовать" за эту фотографию.Поэтому часть формы, которая позволяет пользователю голосовать, отправит запрос «создать».

Этот запрос обрабатывается ajax.Он работает правильно, и статистика для обновления фотографий (через ajax) по мере голосования.

Пользователи также могут изменять свои голоса.Если пользователь посещает фотографию, за которую проголосовал, прежде чем он увидит форму для редактирования своего голоса.Они могут менять свой голос столько раз, сколько хотят, и страница обновляется так, как и ожидалось, с помощью ajax.

Проблема заключается в следующем:

После того, как пользователь ПЕРВЫЙ раз проголосует, форма должнабыть обновленным, чтобы он больше не пытался создать новый голос, а отредактировал существующий, только что созданный голос.В настоящее время это не работает.

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

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

код для моего «create.js.erb» выглядит следующим образом:

$(function () {
    $('table#content_score').replaceWith("<%= escape_javascript(render :partial => 'stats') %>");
    $('form.vote_ballot').replaceWith("<%= escape_javascript(render :partial => 'ballot') %>");
});

Что должно произойти при обновлении формы voice_ballot - следовательно, с «new» на «edit»».Это случается, если вы обновляете страницу, но не если вы создаете новый голос через AJAX.Однако первоначальный щелчок обновляет статистику (первая строка заменяет «table # content_score»).

Итак, есть идеи или предложения?

Как получить форму для изменения«новый» для «редактирования» при создании контента с помощью ajax?Чего мне не хватает?

Спасибо!

1 Ответ

1 голос
/ 04 декабря 2010

Вместо того, чтобы пытаться изменить DOM сложными способами, почему бы не сделать одно действие, либо создать или обновить голосование. Наличие только одного голоса за фотографию - это логика предметной области, поэтому имеет смысл поместить ее в модель.

class Vote < ActiveRecord::Base
  def self.vote(user, photo_id, attributes = {})
    vote = user.votes.find_or_create_by_photo_id(photo_id)
    vote.update_attributes!(attributes)
    vote
  end
end

Не беспокойтесь о нарушении соглашения REST для этого. С точки зрения пользователей, вы голосуете, идентичность голоса, который вы могли отдать, не имеет к этому никакого отношения.

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