2012-05-12 157 views
0

这让我非常震惊,而且还有很多事情需要我在这里寻求帮助。将AJAX'添加到收藏夹'添加到此控制器?

现在,我有一个资源列表。在每个资源内部,通过单击链接,可以让某人“将其添加为最爱”。我有正常的重定向工作,但作为整合AJAX,使他们能够不喜爱的页面清爽,我完全失去了...

  1. 现在我有它,因为它似乎是一个CRUD“把”行动'更新'

FavoritesController(更新在该控制器的唯一操作)

def update 

    @favorite = Favorite.find_or_initialize_by_resource_id_and_user_id(params[:id], current_user.id) 

    if @favorite.persisted? 
     @favorite.destroy 
    else 
     if @favorite.valid? 
      @favorite.save 
     end 
    end 

    redirect_to root_url 
    end 

我的观点:

<%= link_to "", favorites_path(:id => resource.id), :class => "star#{star_post?(resource)}", :method => "put" %> 

我的路线:

resource :favorites, :only => [:update] 

我的JS:

$('.res-list .star').click(function(){ 
    $.put('/favorites/?id=' + $(this).attr('data-id')); 
    return false; 
    }); 

回答

5

有几种方法可以做到这一点。您可以使用link_to_function,通过它可以传递JavaScript方法(如果您已在视图或application.js中定义它,您甚至可以传递一个自定义的方法)。在这种方法中,您可以设置您的AJAX调用来执行更新操作。

视图(使用jQuery的put宏):

<%= link_to_function "AJAX Link", "$.put('/favorites/#{resource.id}');" %> 

另一种方式做,这是给你的链接加法HTML选择。再次,你需要写一些js来实现更新操作。我倾向于喜欢这种方式,因为我喜欢使用按钮,而不是<a href="#">标签。 (虽然老实说,我结束了刚刚创建button_to_function方法调用的content_tag(:button)代替content_tag(:a)

+0

谢谢,我想我有一些。我需要用respond_to来更新我的控制器吗? – Tallboy

+0

不,你的默认HTML格式将会很好。你的控制器将重定向到将会呈现页面的根网址,但AJAX忽略所有这些。如果你想避免网络冲击,我想你可以有不同的'respond_to | format |'。 – Ron

+0

感谢您的帮助:)如果您不介意,我有一些超级简要说明。我相信你的第二种方法。到目前为止,我设置了一个JS功能,它捕获收藏夹链接上的点击事件。里面,我有'$ .put('/ favorites /')'但我如何传入当前ID?我会不得不使用类似于数据属性的东西,读取它并将其插入到请求中? – Tallboy

1

我会建议在基本jQuery和Ajax处理的出发与此Railscast。这有点过时了,但仍然非常坚实,并且会为您提供基本知识来帮助您入门。

http://railscasts.com/episodes/136-jquery

它会给你如何Ajax调用附加到元素的网页上,处理的请求处理,制作一个基本的JavaScript浏览部分,将更新用户形式的想法。

祝你好运!

+1

+1也为Rails 3.1参见: http://stackoverflow.com/questions/6405688/rails-3-1-ajax-问题 –