使用Ajax解决在Rails中创建新记录的问题

时间:2010-08-09 19:31:18

标签: ruby-on-rails

我正在社区博客应用程序中实现“收藏夹”功能,并希望使用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中,一切都很好。一切都得救了。

我在忽视/做错了什么?

1 个答案:

答案 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
%>