【问题标题】:Rails: Form partial not clearing/reloading after AJAX submissionRails:AJAX提交后表单部分不清除/重新加载
【发布时间】:2013-08-05 02:01:16
【问题描述】:

我正在尝试创建一个单页/视图应用程序。我提交了一个创建简单推文对象的表单:

_form.html.erb

<div id="schedule-tweet-form">
  <%= simple_form_for @tweet, :remote => true do |f| %>
    <%= f.input :text, :input_html => {:cols => 60, :rows => 6} %>
    <%= f.input :scheduled_time %>
    <%= f.button :submit, "Schedule Tweet", :class => "f-button" %>
  <% end %>
</div>

(scheduled_time 是日期时间类型,有多个选择框)

表单提交工作正常,在我的数据库中创建一行没有问题。问题是提交后,表单中的数据并没有被清除。推文的文本仍在输入文本框中,并且预定时间仍然选择了相应的选择框。

这是我的控制器:

tweets_controller.rb

class TweetsController < ApplicationController
  def index
    @tweet = Tweet.new
  end

  def create
    @tweet = Tweet.new(params[:tweet])
    @tweet.user = current_user

    respond_to do |format|
      if @tweet.save
        @tweet.tweet_at_scheduled_time
        flash[:notice] = "Tweet has been scheduled"
        format.html { render 'index' }
        format.js
      else
        format.html { render 'index' }
        format.js { render 'reload' }
      end
    end
  end
end

这里是局部渲染的视图:

index.html.erb

<div id="schedule-tweet-form-container">
  <%= render 'form' %>
</div>

我尝试使用一些 jQuery 删除表单并在表单提交并调用 create 操作后重新渲染一个新表单,但奇怪的是,在调用“append”后表单会返回提交的推文信息(输入字段中的文本和 schedule_time 数据)。

create.js.erb

<% if @tweet.save %>
  $("#schedule-tweet-form").remove();
  $('#schedule-tweet-form-container').append("<%= j render 'form' %>");
<% end %>

在过去的几个小时里,我一直在为此绞尽脑汁,但我从其他各种堆栈溢出问题中尝试过的其他方法都没有奏效。感谢您的帮助。

【问题讨论】:

    标签: javascript jquery ruby-on-rails ruby ajax


    【解决方案1】:

    在您的创建动作中,保存推文后,您需要再次初始化推文对象。

    但是在你的 create.js.erb 中你使用了@tweet,所以修改代码如下

    <% if @tweet.save 
         @tweet = Tweet.new
    %>
    
      $("#schedule-tweet-form").remove();
      $('#schedule-tweet-form-container').append("<%= j render 'form' %>");
    <% end %>
    

    【讨论】:

    • 不幸的是,这不起作用。它最终给了我一个未定义的方法错误。另外,当它再次点击索引操作时,它不应该触发@tweet = Tweet.new吗?
    • 做到了,非常感谢。当我将render 'index' 更改为redirect_to 时,我也让它工作,向index 操作添加了一个respond_to 块,并将jQuery 代码添加到index.js.erb,但它正在刷新页面,我猜是因为重定向。不过,您的解决方案完全是 AJAX-y,并将其全部保存在一个页面上,无需刷新。谢谢!
    【解决方案2】:

    你应该使用

        format.json 
    

    关于 ajax 调用

    检查此线程的以下答案以制作简单的表单制作 json 帖子

    Is there a way to submit ajax/json requests with simple_form for Rails

    【讨论】:

    • 我对 JSON 还不是很了解,它仍然让我感到困惑。有什么好的资源可以让我了解更多信息吗?
    • 在 ajax 调用上渲染 js 是一种不鼓励的做法。而是处理您的 POST / PUT 调用的响应并在客户端执行必要的操作。如果任何数据需要从客户端传输到服务器,反之亦然。使用 JSON 作为序列化格式。 javascript vatively 理解 JSON,Rails 内置支持序列化/反序列化 json
    • @irfn,我对此也很感兴趣,希望您能指导我阅读更多关于渲染 json 而不是 js 的优势的体面文章
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多