我正在社区博客应用程序中实现“收藏夹”功能,并希望使用Ajax。
当用户喜欢首页帖子时,可以点击“+”符号将该帖子添加到他们的收藏夹中。
该功能在没有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
文本在视图中正确呈现,就好像操作有效一样。但是当我查看收藏夹列表时,它尚未添加。
我跑了
行@favorite = Favorite.new(:entry_id => :entry, :user_id => :user)
在交互式shell中,一切都很好。一切都得救了。
我在忽视/做错了什么?
答案 0 :(得分: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
%>