2010-12-04 7 views
1

Итак, вот моя проблема:Rails: заменить форму «create» после формы «ajax»

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

Чтобы разрешить голосование с большими пальцами или большими пальцами, у меня есть форма, которая передается через 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') %>"); 
}); 

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

Итак, любые идеи или предложения?

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

Спасибо!

ответ

1

Вместо того, чтобы пытаться изменить 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 для этого. С точки зрения пользователей, вы голосуете, личность голоса, которую вы, возможно, дали ранее, не имеет к этому никакого отношения.

+0

Хорошо, это другой подход, но я вижу, как это может сработать. Я буду экспериментировать с ним. Как вы получаете форму для запуска пользовательского действия вместо стандартного создания или обновления? – Andrew 2010-12-04 15:53:57

Смежные вопросы