【问题标题】:Rails: replace "create" form with "edit" form after ajax requestRails:在ajax请求后用“编辑”表单替换“创建”表单
【发布时间】:2010-12-04 07:20:15
【问题描述】:

所以,这是我的问题:

我有一个带有照片和用户的 Rails 3 应用程序。用户有_许多照片。照片可以被其他用户投票“赞成”或“反对”。有一个 Vote 模型可以处理这个问题。用户有很多票(每张照片一张),照片有很多票(每张用户一张),在双向 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') %>");
});

应该发生的是刷新 vote_ballot 表单 - 因此从“新”变为“编辑”。如果您刷新页面,则会发生这种情况,但如果您通过 AJAX 创建新投票则不会。但是,初始点击确实会刷新统计信息(第一行,替换 'table#content_score')。

那么,有什么想法或建议吗?

在使用 ajax 创建内容时,如何让表单从“新建”变为“编辑”?我错过了什么?

谢谢!

【问题讨论】:

    标签: jquery ruby-on-rails ajax forms ruby-on-rails-3


    【解决方案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 约定。从用户的角度来看,你是在投票,你之前可能给的投票的身份与它无关。

    【讨论】:

    • 好的,这是一个不同的策略,但我知道它是如何工作的。我会用它做实验。如何让表单触发自定义操作而不是标准的创建或更新?
    • 更笼统地说,我理解您对模型的看法,但您将如何将其合并到视图中?现在我正在使用一个提交创建或更新请求的表单,并且(使用 jQuery)表单会自动提交任何更改。我只需要调整表单,还是需要以不同的方式触发此操作?谢谢!
    • 只需制作一个提交给一个操作的表单。因此,您的视图表现得就像它总是在创建一个新的投票,而不管之前的投票如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 2016-01-27
    • 2018-03-10
    相关资源
    最近更新 更多