所以,这是我的问题:
我有一个带照片和用户的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创建内容时,如何让表单从“新”更改为“编辑”?我错过了什么?
谢谢!
答案 0 :(得分: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约定。从用户的角度来看,您正在投票,您之前可能已经投票的身份与之无关。