Rails 3 and Ajax interaction



我是 Ruby on rails 的初学者,我正在练习 Ajax,但不幸的是我似乎无法让我的 ajax 工作。我正在尝试在脚手架中 Ajaxify 我的删除。

这是我的控制器:

class PlantsController < ApplicationController
  # GET /plants
  # GET /plants.json
  def index
    @plants = Plant.all
    respond_to do |format|
      format.html #index.html.erb
      format.json { render json: @plants }
    end
  end
  # GET /plants/1
  # GET /plants/1.json
  def show
    @plant = Plant.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @plant }
    end
  end
  # GET /plants/new
  # GET /plants/new.json
  def new
    @plant = Plant.new
    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @plant }
    end
  end
  # GET /plants/1/edit
  def edit
    @plant = Plant.find(params[:id])
  end
  # POST /plants
  # POST /plants.json
  def create
    @plant = Plant.new(params[:plant])
    respond_to do |format|
      if @plant.save
        format.html { redirect_to @plant, notice: 'Plant was successfully created.' }
        format.json { render json: @plant, status: :created, location: @plant }
      else
        format.html { render action: "new" }
        format.json { render json: @plant.errors, status: :unprocessable_entity }
      end
    end
  end
  # PUT /plants/1
  # PUT /plants/1.json
  def update
    @plant = Plant.find(params[:id])
    respond_to do |format|
      if @plant.update_attributes(params[:plant])
        format.html { redirect_to @plant, notice: 'Plant was successfully updated.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @plant.errors, status: :unprocessable_entity }
      end
    end
  end
  # DELETE /plants/1
  # DELETE /plants/1.json
  def destroy
    # binding.pry
    @plant = Plant.find(params[:id])
    @plant.destroy
    respond_to do |format|
      format.html { redirect_to plants_url }
      format.js
      format.json { head :no_content }
    end
  end
end

这是它的观点:

<h1>Listing plants</h1>
<table class="show">
  <tr>
    <th>Name</th>
    <th>Comment</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
<%= render "plants/plant" %>
</table>
<br />
<%= link_to 'New Plant', new_plant_path %>

这是我的部分:

<% @plants.each do |plant| %>
  <tr>
    <td><%= plant.name %></td>
    <td><%= plant.comment %></td>
    <td><%= link_to 'Show', plant %></td>
    <td><%= link_to 'Edit', edit_plant_path(plant) %></td>
    <td><%= link_to 'Destroy', plant, confirm: 'Are you sure?', :method => :delete, :remote => true %></td>
  </tr>
<% end %>

最后,这是所谓的破坏.js.erb,它将刷新DOM:

$('.show').html("<%= render @plant %>");

请问任何人都可以对此有所了解吗?

附加信息:

问题是,当我点击Destroy链接时...记录正在被删除,但 DOM 未呈现,我必须刷新才能看到更改:(

经过一夜的思考和进食,这是我制定的解决方案。

首先,我将描述我问题的根源。似乎这段代码$('.show').html("<%= render @plant %>"),rails 正在尝试渲染路由 '/plants/:id/',但不幸的是,你刚刚删除了它。我所做的解决方法是在@plant.destroy代码下方添加@plants = Plant.all,并在destroy.js.erb中渲染了部分,它如下所示:

$('.show').html("<%= render 'plants/plant' %>");

使用该代码,它将使用新的查询值集呈现部分。希望我解释正确。

经过多次试验,我尝试了一个适合我的新教程。教程的链接位于底部。如果我找到了这个问题的解决方案,我仍然会更新这篇文章。

教程链接--->链接在这里

最新更新