2010-08-09 88 views
1

我正在实现社区博客应用程序中的“收藏夹”功能,并且想要使用Ajax。使用Ajax在Rails中创建新记录的故障诊断

当用户喜欢首页帖子时,有一个“+”符号,他们可以点击将该帖子添加到他们的收藏夹中。

该功能在没有Ajax功能的情况下效果很好。但现在我添加了Ajax。

在视图:

<span id="favorite_<%= entry.id %>"> 
    <%= link_to_remote "+", :url => { :action => 'add_favorite' }, 
          :entry => entry.id, 
          :user => session[:user_id], 
          :update => 'favorite_' + entry.id.to_s %> 
</span> 

相应的控制器动作:

def add_favorite 
    @favorite = Favorite.new(:entry_id => :entry, :user_id => :user) 
    if @favorite.save 
    render :text => "added to favorites", :layout => false 
    end 
end 

文本被恰当地渲染在视图中,仿佛动作已工作。但是当我查看收藏夹列表时,它并没有被添加。

我跑在交互shell行

@favorite = Favorite.new(:entry_id => :entry, :user_id => :user) 

,它是所有好的。一切都得救了

我在忽略/做错什么?

回答

0

为你传递符号代替变量的一些原因,所以你可能会得到什么也没有记录分配的,因此没有任何关联:

@favorite = Favorite.new(:entry_id => params[:entry_id], :user_id => params[:user_id]) 

应该处理链接的关联,如果你有定义了一个belongs_to

记住:user_id仅仅是一个符号,仅此而已,其中user_id是一个变量,params[:user_id]是可能在被传递的参数。符号经常被用来作为哈希键,因为它们很轻的重量和容易比较。

为了一致起见,请尝试并在_id类型参数中输入_id。在这种情况下,这将是:

<%= link_to_remote "+", 
    :url => { :action => 'add_favorite' }, 
    :entry_id => entry.id, 
    :user_id => session[:user_id], 
    :update => 'favorite_' + entry.id.to_s 
%> 
+1

谢谢tadman!解决方案的另一半是包含:entry_id和:user_id作为url的一部分(:url => {here})。 – txpost 2010-08-09 21:13:19

+0

你也是对的。不要忘记,许多模型可能有一个自定义的'#to_param'方法,您应该使用它来代替'#id'。唯一适合使用'#id'的地方就像是一个唯一的标识符,就像你的DOM ID一样,或者在构建SQL时。对于URL,请始终使用'#to_param'。 – tadman 2010-08-10 14:43:04