Ruby on Rails,Ajax未将数据返回网页,也不会渲染



我在业余时间仅在3个月内学习轨道,因此我正在使用Rails 5.1,Ruby 2.4.2,Mysql!4.14在Ubuntu上16.04。p>我的问题是我使用Ajax的尝试都失败了。我读了很多示例,但是当我尝试在项目中使用它们时,我不会回复回到网页。我已经确认控制器已被调用,看来它应该发送回正确的数据,但是我什么也没回到网页。

我试图将我的索引页面从几千个记录中过滤到用户选择的类别中的记录。该过滤器似乎给了我正确的数据,但没有回到页面。

items_controller:

 class ItemsController < ApplicationController
      before_action :set_item, only: [:show, :edit, :update, :destroy]
      def index
        @items = Item.filter(params.slice(:itemtype_id))
        @itemtypes =Itemtype.order(:description)
        respond_to do |format|
          format.html { render "index.html.erb" }
          #format.js { render :partial => "items_div.html.erb" }
          format.js {render layout: false}
          format.json {render json: @items}
          format.all {render :partial => "items_div.html.erb"}
        end
      end
      def show
        @item = Item.find(params[:id])
      end
      def new
        @item = Item.new
        @itemtypes = Itemtype.order(:description).all
      end
      # GET /items/1/edit
      def edit
        @item = Item.find(params[:id])
        @itemtypes = Itemtype.order(:description).all
      end
      def create
        @item = Item.new(item_params)
        @itemtypes = Itemtype.order(:description).all
        respond_to do |format|
          if @item.save
            format.html { redirect_to @item, notice: 'Item was successfully created.' }
            format.json { render :show, status: :created, location: @item }
          else
            format.html { render :new }
            format.json { render json: @item.errors, status: :unprocessable_entity }
          end
        end
      end
      def update
        @itemtypes = Itemtype.order(:description).all
        @sourcebooks = Sourcebook.order(:description).all
        respond_to do |format|
          if @item.update(item_params)
            format.html { redirect_to @item, notice: 'Item was successfully updated.' }
            format.json { render :show, status: :ok, location: @item }
          else
            format.html { render :edit }
            format.json { render json: @item.errors, status: :unprocessable_entity }
          end
        end
      end
      def destroy
        @item.destroy
        respond_to do |format|
          format.html { redirect_to items_url, notice: 'Item was successfully destroyed.' }
          format.json { head :no_content }
        end
      end
      private
        def set_item
          @item = Item.find(params[:id])
        end
        def item_params
          params.fetch(:item, {})
          params.require(:item).permit(:description,
            :itemtype_id,
            :genericdescription,
            :note)
        end
    end

items.index.html.erb:

项目

<div itemtype>
  <%= form_with url: items_path(:itemtype), method: :get, remote: true do     |form| %>
  <%= form.label :itemtype, 'Item Type' %>
  <%= form.collection_select(:itemtype_id, @itemtypes, :id, :description,     {:include_blank => 'All'}) %>
  <% # link_to 'List', items_path(:itemtype_id) %>
  <%= form.submit "Go" %>
</div>
<%end %>
<div id="items_div">
<table>
  <thead>
    <tr>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
    <% @items.each do |item| %>
      <tr>
        <td><%= link_to item.description , item%></td>
        <td><%= item.genericdescription %></td>
        <td><%= link_to 'Edit', edit_item_path(item) %></td>
        <td><%= link_to 'Destroy', item, method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
  </tbody>
</table>
</div>
<br>
<%= link_to 'New Item', new_item_path %>

Items/Index.js.erb

$("#items_div").html("<%= escape_javascript(render partial: 'items/items_div'), locals:{items: @items}) %>");

items._items_div.html.erb

    <table>
      <thead>
        <tr>
          <th colspan="3"></th>
        </tr>
      </thead>
      <tbody>
        <% @items.each do |item| %>
          <tr>
            <td><%= link_to item.description , item%></td>
            <td><%= item.genericdescription %></td>
            <td><%= '*' if item.note? %>
            <% if session[:campaignadmin]==true || session[:campaigndm]==true || session[:admin]=='1'%>
            <td><%= link_to 'Edit', edit_item_path(item) %></td>
            <% end %>
            <% if session[:campaignadmin]==true  || session[:admin]=='1'%>
            <td><%= link_to 'Destroy', item, method: :delete, data: { confirm: 'Are you sure?' } %></td>
            <% end %>
          </tr>
        <% end %>
      </tbody>
    </table>

utaes.rb:

  resources :items do
    collection do
      get :itemtype
    end
  end

我意识到_item_div重复了我的主循环,因为它使索引中的主循环复制了,一旦我有效,我将用渲染部分替换渲染部分。

对我做错事或失踪的任何帮助将不胜感激。我花了3个晚上和一个周末工作,无法弄清楚断开连接的位置。

,只要猜测您正在使用部分渲染局部变量items,因此您不应在部分中使用@items: -

#$("#items_div").html("<%= escape_javascript(render partial: 'items/items_div'), locals:{items: @items}) %>");
$("#items_div").html("<%=j render partial: 'items/items_div', locals: {items: @items} %>");

和您的部分: - items._items_div.html.erb

<table>
  <thead>
    <tr>
      <th colspan="3"></th>
    </tr>
  </thead>
  <tbody>
    <%# @items.each do |item| %>
    <% items.each do |item| %>
      <tr>
        <td><%= link_to item.description , item%></td>
        <td><%= item.genericdescription %></td>
        <td><%= '*' if item.note? %>
        <% if session[:campaignadmin]==true || session[:campaigndm]==true || session[:admin]=='1'%>
        <td><%= link_to 'Edit', edit_item_path(item) %></td>
        <% end %>
        <% if session[:campaignadmin]==true  || session[:admin]=='1'%>
        <td><%= link_to 'Destroy', item, method: :delete, data: { confirm: 'Are you sure?' } %></td>
        <% end %>
      </tr>
    <% end %>
  </tbody>
</table>

也在您的index.html.erb页面上,您甚至应该使用此部分,而不是再次编写相同的代码: - (干概念(

<div itemtype>
  <%= form_with url: items_path(:itemtype), method: :get, remote: true do     |form| %>
  <%= form.label :itemtype, 'Item Type' %>
  <%= form.collection_select(:itemtype_id, @itemtypes, :id, :description,     {:include_blank => 'All'}) %>
  <% # link_to 'List', items_path(:itemtype_id) %>
  <%= form.submit "Go" %>
</div>
<%end %>
<div id="items_div">
  <%=render partial: 'items/items_div', locals:{items: @items})%>
</div>
<br>
<%= link_to 'New Item', new_item_path %>

在您的控制器上: -

def index
    @items = Item.filter(params.slice(:itemtype_id))
    @itemtypes = Itemtype.order(:description)
    respond_to do |format|
      format.html { @items }
      format.js {@items}
      format.json {render json: @items}
    end
end

我现在已经解决了此问题。感谢您的所有帮助,因为这都为我对问题的理解做出了贡献。

解决方案降低到2期。

1(form_with调用url:tock_path(:itemType(...并且应该简单地为url:tock_path ...这导致控制器中的envert_to不识别格式(它将itemType视为格式而不是JS(

2(index.js.erb已更改为:

$("#items_div").html("<%=j render partial: 'items/items_div', locals: {items: @items} %>");

items.controller.index现在读取如下,是此处更改的唯一方法

def index
    if params[:itemtype_id]!=nil and params[:itemtype_id]!=0
      @items = Item.filter(params.slice(:itemtype_id)).order(:description)
    else
      @items = Item.order(:description)
    end
    @itemtypes =Itemtype.order(:description)
     respond_to do |format|
       format.html { render "index.html.erb" }
       format.js {render layout: false}
      end
end

这更简单,现在按预期工作。

再次感谢那些花时间帮助我解决这个问题的人。

最新更新