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

时间:2012-08-12 20:25:46

标签: ruby-on-rails ruby-on-rails-3

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

favorites_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) %>");

教室/ _classroom_details.html.erb

<div id="favorite_classroom">
<% if loggedin_user.favorite_classroom?(@classroom) %>
    <%= link_to 'Remove this Classroom', classroom_favorite_path(@classroom), :remote => true, :method => :delete %>
<% else %>
    <%= link_to 'Favorite this Classroom', classroom_favorites_path(@classroom), :remote => true, :method => :post %>
<% end %>

路线:

classroom_favorites POST   /classrooms/:classroom_id/favorites(.:format)  {:action=>"create", :controller=>"favorites"}
classroom_favorite DELETE /classrooms/:classroom_id/favorites/:id(.:format) {:action=>"destroy", :controller=>"favorites"}

点击“收藏此课堂”链接时出错: ActionView::Template::Error (No route matches {:action=>"destroy", :controller=>"favorites"

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

现在注意,删除课堂用单引号括起来,而不是加倍。

此外,您的路线不正确,因为您在教室内嵌套了收藏夹。编写链接时,需要添加要删除的@favorite对象:

= link_to 'Remove Favorite', classroom_favorite_path([@classroom, @favorite]), :remote => true, :method => :delete

现在您尝试访问的路线有效。那应该摆脱错误。

答案 1 :(得分:0)

我认为你不需要最喜欢的控制器,你需要的是对教室控制器最喜欢/不喜欢的动作。这是它看起来的样子

<强> classroom_controller.rb

respond_to :html, :js

def favorite
  # ... find classroom by id
  # do your stuff
  @classroom.favorite = !@classroom.favorite
  respond_with(@classroom)
end

<强>视图/教室/ favorite.js.erb

<%# 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) %>");

以下是路径助手的技巧,[:favorite, @classroom]应该被转换为/classrooms/:id/favorite。如果它不起作用,请尝试favorite_classrooms_path(@classroom)

最后添加到 routes.rb

resource :classrooms do 
  member { get :favorite }
end

答案 2 :(得分:0)

您似乎需要在链接中引用“favorite_id”以匹配您的路线。

在你的情况下,可能是:

classroom_favorite_path([current_classroom, @classroom])