【问题标题】:After an AJAX action to create, how do you send back an updated collection of objects in Rails?在创建 AJAX 操作之后,如何在 Rails 中发回更新的对象集合?
【发布时间】:2015-10-02 16:26:55
【问题描述】:

所以我很困惑如何在创建操作之后发回更新的@tasks 集合,以便我可以在页面上看到新创建的项目而无需刷新。我该怎么做呢?让我按顺序向您介绍我的代码。

首先,这是我的 index.html.erb 代码:

<div class="row">
  <div class="col-md-5 col-md-offset-1">
    <h2>Tasks</h2>
  </div>

  <div class="col-md-2 col-md-offset-4">
    <%= link_to new_task_path, remote: true do %>
      <button class="btn btn-default">New</button>
    <% end %>
  </div>
</div>

<div class="row">
  <div class="col-md-6 col-md-offset-2" id="task-form" style="display:none;"></div>
</div>

<div class="row">
  <div class="col-md-7 col-md-offset-1" id="tasks"><%= render @tasks %></div>
</div>

我将单击“新建”按钮,该按钮会触发控制器的新操作。这是我的控制器代码:

class TasksController < ApplicationController
  before_action :all_tasks, only: [:create, :update]
  before_action :set_tasks, only: [:edit, :update]

  respond_to :html, :js

  # index action has been removed
  def index
    @tasks = Task.all

    respond_to do |format|
      format.html
      format.json
    end
  end

  def new
    @task = Task.new
  end

  def create
    @task  = Task.create(task_params)
  end

  def update
    @task.update_attributes(task_params)
  end

  private

  def all_tasks
    @tasks = Task.all
  end

  def set_tasks
    @task = Task.find(params[:id])
  end

  def task_params
    params.require(:task).permit(:description, :deadline)
  end
end

这将呈现 new.js.erb 代码:

$('#task-form').html("<%= j (render 'form') %>");
$('#task-form').slideDown(350);

这将呈现新表单:

<%= simple_form_for @task, remote: true do |f| %>
  <%= f.input :description %>
  <%= f.input :deadline %>
  <%= f.button :submit %>
<% end %>

当我点击提交时,它会再次点击控制器的创建动作

def create
    @task  = Task.create(task_params)
  end

在这里之后,我想做的是发回更新的@tasks 集合并将它们呈现在页面上。无论如何我可以再次渲染 index.html.erb 视图并将其发送 Task.all 吗?

【问题讨论】:

    标签: ruby-on-rails ajax


    【解决方案1】:

    在您的def create 中添加实例变量@tasks

    def create
      @task  = Task.create(task_params)
      @tasks = Task.all
      respond_to do |format|
        format.js
      end
    end
    

    创建一个新文件create.js.erb

    $('#tasks').html("<%= j (render @tasks) %>");
    

    【讨论】:

    • rails 会自动查找 create.js.erb 文件吗?它是如何做到的?
    • 还有,render @tasks 在幕后为你做了什么?
    • 是的。 Rails 将在create 方法中使用create.js.erb 作为响应js 格式。在渲染@tasks 的幕后,我不确定这一点,但rails 可以自动检测文件和对象。你能告诉我你在渲染部分@tasks 中使用什么文件吗?
    【解决方案2】:

    在您的情况下,您的 create.js.erb 将是这样的:

    $('#tasks').append("<li> <%= @task.inspect %> </li>");
    

    【讨论】:

      猜你喜欢
      • 2021-11-01
      • 1970-01-01
      • 2013-10-12
      • 2013-09-09
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多