Ruby on rails 如何在RubyonRails中使用相同的.js更新重新创建远程链接?

Ruby on rails 如何在RubyonRails中使用相同的.js更新重新创建远程链接?,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,基本上,我想让一个链接能够从“Favorited”动态刷新到“Removed”,同时让用户可以通过重新点击新按钮返回。但操作确实发生了,因为当我刷新页面时,会显示更新按钮。为什么点击“最喜欢的教室”链接不起作用?“删除此教室”链接似乎有效。谢谢你的帮助 收藏夹\u controller.rb: def create current_classroom.add_to_favorites(@classroom) current_classroom.save respond

基本上,我想让一个链接能够从“Favorited”动态刷新到“Removed”,同时让用户可以通过重新点击新按钮返回。但操作确实发生了,因为当我刷新页面时,会显示更新按钮。为什么点击“最喜欢的教室”链接不起作用?“删除此教室”链接似乎有效。谢谢你的帮助

收藏夹\u controller.rb:

  def create
    current_classroom.add_to_favorites(@classroom)
    current_classroom.save
    respond_to do |format|
      format.js {  }
      format.html {redirect_to @classroom}
    end
  end

  def destroy
    current_classroom.remove_from_favorites(@classroom)
    current_classroom.save
    respond_to do |format|
      format.js {  }
      format.html {redirect_to @classroom}
    end
  end
收藏夹/create.js.erb

$("#favorite_classroom").html("<%= escape_javascript(link_to 'Remove the Classroom', classroom_favorite_path(@classroom), :remote => true, :method => :delete) %>");
单击“收藏此教室”链接时出错:
ActionView::Template::Error(没有路由匹配{:action=>“destroy”,:controller=>“favorites”


谢谢!

您在js文件中使用了两次双引号。您不能这样做。您需要像这样重写它-

$("#favorite_classroom").html("<%= escape_javascript(link_to 'Remove the Classroom', classroom_favorite_path(@classroom), :remote => true, :method => :delete) %>");

现在,您尝试访问的路由是有效的。这应该可以消除错误。

我认为您不需要最喜欢的控制器,您需要的是教室控制器的最喜欢/最不喜欢的操作。下面是它的外观

教室\u控制器.rb

respond_to :html, :js

def favorite
  # ... find classroom by id
  # do your stuff
  @classroom.favorite = !@classroom.favorite
  respond_with(@classroom)
end
<%# the message should be oposite to favorite %>
<% msg = @classroom.favorite ? "Remove this Classroom" : "Favorite this Classroom" %>
$("#favorite_classroom").html("<%= escape_javascript(link_to msg, [:favorite, @classroom], :remote => true) %>");
resource :classrooms do 
  member { get :favorite }
end
视图/教室/favorite.js.erb

respond_to :html, :js

def favorite
  # ... find classroom by id
  # do your stuff
  @classroom.favorite = !@classroom.favorite
  respond_with(@classroom)
end
<%# the message should be oposite to favorite %>
<% msg = @classroom.favorite ? "Remove this Classroom" : "Favorite this Classroom" %>
$("#favorite_classroom").html("<%= escape_javascript(link_to msg, [:favorite, @classroom], :remote => true) %>");
resource :classrooms do 
  member { get :favorite }
end

看起来您需要在链接中引用“favorite_id”以匹配您的路线

在您的情况下,可能是:

classroom_favorite_path([current_classroom, @classroom])

好的,我已经用这些信息更新了我的问题。不再出现内部500错误。我还删除了双引号,但删除了“最喜欢的教室”仍然不起作用。我在上面的问题中添加了一个路由错误。将两个对象发送到
教室\u收藏夹\u路径
不起作用。就数据结构而言,收藏夹bc没有单独的表。表示教室的ID数组作为字段存在于用户表中。所需的只是@classification and我们知道登录的用户。@Goalie很好,如果您没有单独的收藏夹表,并且它们作为id存储在用户表中,您就不能使用RESTful路由和Rails的删除方法并期望它们工作。Rails是:约定优先于配置。您需要遵循REST规则,否则事情不会(也不应该)发生工作。您遇到的问题与链接等无关,而与您设置模型和数据结构的方式有关。有一件事可能很重要,但我不想提及,让事情复杂化的是,我们正在使用mongoDB,这与大多数RoR应用程序所使用的不同。这可能有关系有了这个。@Goalie,您正在使用的数据库不会影响这一点。问题是您正在尝试使用默认的RESTful路由,而没有一个基础的收藏夹表。它不是这样工作的。您需要创建自定义路由来完成您要做的事情。嗯,您的控制器上确实需要一个
destroy
方法。如果您有一个,您可以吗请展示给我们看?抱歉,不小心从问题中删除了它。将其放回SO问题中。我相信您也有一个
destroy.js.erb
,它与创建一个具有相同的功能。我唯一能建议您的是在再次添加新内容之前删除
#favorite_school
div的内部htmlg如下:
$('@favorite\u classification').children().remove()
@MurifoX-我正在使用jQuery的html函数,我相信它会替换#favorite\u classification div中的所有html,所以我不需要删除任何内容。如果我错了,请纠正我。