Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Rails:使用has多关系时,与链接(…,remote:true)的行为不一致_Javascript_Ruby On Rails_Ajax_Has Many_Helpers - Fatal编程技术网

Javascript Rails:使用has多关系时,与链接(…,remote:true)的行为不一致

Javascript Rails:使用has多关系时,与链接(…,remote:true)的行为不一致,javascript,ruby-on-rails,ajax,has-many,helpers,Javascript,Ruby On Rails,Ajax,Has Many,Helpers,在Rails应用程序中使用常规路由与AJAX时,我遇到了不一致的行为。我有一个链接,它的功能是通过关系来摧毁一个拥有的多个链接。如果不使用AJAX,就没有问题。当使用AJAX时(即remote:true),链接会破坏关系以及所有者对象 详情如下: 我有一个简单的应用程序,它有阅读器、书籍、和收藏夹。一个读者通过收藏夹拥有许多书籍,而一本书通过收藏夹拥有许多读者。当我使用链接“从收藏夹中删除”时,当使用AJAX时,这本书也会被销毁。如果没有remote:true,则不会发生此问题。以下是服务器日志

在Rails应用程序中使用常规路由与AJAX时,我遇到了不一致的行为。我有一个链接,它的功能是通过关系来摧毁一个
拥有的多个链接。如果不使用AJAX,就没有问题。当使用AJAX时(即remote:true),链接会破坏关系以及所有者对象

详情如下:

我有一个简单的应用程序,它有
阅读器
书籍
、和
收藏夹
。一个读者通过收藏夹拥有许多
书籍,而一本书通过收藏夹拥有许多读者。当我使用链接“从收藏夹中删除”时,当使用AJAX时,这本书也会被销毁。如果没有remote:true,则不会发生此问题。以下是服务器日志:

Started DELETE "/favorites/5" for ::1 at 2016-01-22 08:06:03 -0800
Processing by FavoritesController#destroy as JS
  Parameters: {"id"=>"5"}
  Favorite Load (0.2ms)  SELECT  "favorites".* FROM "favorites" WHERE     "favorites"."id" = ? LIMIT 1  [["id", 5]]
  Book Load (0.1ms)  SELECT  "books".* FROM "books" WHERE "books"."id"     = ? LIMIT 1  [["id", 5]]
   (0.1ms)  begin transaction
  SQL (0.3ms)  DELETE FROM "favorites" WHERE "favorites"."id" = ?      [["id", 5]]
   (1.9ms)  commit transaction
Redirected to http://localhost:3000/books/5
Completed 302 Found in 5ms (ActiveRecord: 2.5ms)


Started DELETE "/books/5" for ::1 at 2016-01-22 08:06:03 -0800
Processing by BooksController#destroy as JS
  Parameters: {"id"=>"5"}
  Book Load (0.1ms)  SELECT  "books".* FROM "books" WHERE "books"."id"     = ? LIMIT 1  [["id", 5]]
   (0.1ms)  begin transaction
  Favorite Load (0.2ms)  SELECT "favorites".* FROM "favorites" WHERE     "favorites"."book_id" = ?  [["book_id", 5]]
  SQL (0.2ms)  DELETE FROM "books" WHERE "books"."id" = ?  [["id", 5]]
   (0.9ms)  commit transaction
Redirected to http://localhost:3000/books
Completed 302 Found in 7ms (ActiveRecord: 1.5ms)
以下是我认为相关的代码:

book.rb

class Book < ActiveRecord::Base
  has_many :favorites, class_name: "Favorite",
                    foreign_key: "book_id",
                    dependent: :destroy
  has_many :readers, through: :favorites
end
唯一感兴趣的控制器是favorites_controller.rb:

class FavoritesController < ApplicationController
  def create
    reader = Reader.find(params[:reader_id])
    @book = Book.find(params[:book_id])
    reader.add_favorite(Book.find(params[:book_id]))
    redirect_to @book
  end

  def destroy
    debugger
    fav = Favorite.find(params[:id])
    @book = Book.find(fav.book_id)
    fav.destroy
    redirect_to @book
  end
end
class-FavoritesController
唯一感兴趣的是书籍/展览:

<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @book.name %>
  <%= favorites_link_for(Reader.last, @book) %>
</p>

<%= link_to 'Edit', edit_book_path(@book) %> |
<%= link_to 'Back', books_path %>

名称:

|

这里有完整的代码:Rails版本是4.2.2。

这个问题是由FavoritesController中的行
重定向到@book
引起的。当我拆下那条线时,一切正常。尽管我仍然不明白为什么
redirect_to@book
会导致在js下而不是在html下删除图书记录,但这一行仍然需要修改,以允许在html和js下有不同的页面响应。我很高兴接受任何能进一步启发我的人的回答

固定控制器如下所示:

class FavoritesController < ApplicationController
def create
    @reader = Reader.find(params[:reader_id])
    @book = Book.find(params[:book_id])
    @reader.add_favorite(Book.find(params[:book_id]))
    respond_to do |format|
      format.html { redirect_to @book }
      format.js
    end
end

def destroy
    fav = Favorite.find(params[:id])
    @book = Book.find(fav.book_id)
    @reader = Reader.find(fav.reader_id)
    fav.destroy
    respond_to do |format|
      format.html { redirect_to @book }
      format.js
    end
  end
end
class-FavoritesController
github上的代码已修复:

class FavoritesController < ApplicationController
  def create
    reader = Reader.find(params[:reader_id])
    @book = Book.find(params[:book_id])
    reader.add_favorite(Book.find(params[:book_id]))
    redirect_to @book
  end

  def destroy
    debugger
    fav = Favorite.find(params[:id])
    @book = Book.find(fav.book_id)
    fav.destroy
    redirect_to @book
  end
end
<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <%= @book.name %>
  <%= favorites_link_for(Reader.last, @book) %>
</p>

<%= link_to 'Edit', edit_book_path(@book) %> |
<%= link_to 'Back', books_path %>
class FavoritesController < ApplicationController
def create
    @reader = Reader.find(params[:reader_id])
    @book = Book.find(params[:book_id])
    @reader.add_favorite(Book.find(params[:book_id]))
    respond_to do |format|
      format.html { redirect_to @book }
      format.js
    end
end

def destroy
    fav = Favorite.find(params[:id])
    @book = Book.find(fav.book_id)
    @reader = Reader.find(fav.reader_id)
    fav.destroy
    respond_to do |format|
      format.html { redirect_to @book }
      format.js
    end
  end
end