我的用户为什么不关注/取消关注按钮?

我正在构建一个应用程序(遵循Michael Hartl的第11章 ),用户可以在其中跟踪由其他用户创建的项目。

我创建了一个ProjectRelationship模型来保存两个组件:用户的follower_id和项目的projectuser_id。 外键已经设置好了。

现在,我的_follow_form.html.erb页面呈现“follow”或“ _follow_form.html.erb ”,具体取决于current_user是否跟随项目。 请参阅下面的代码,看看我错过了什么。

现在,在每个项目显示页面上生成跟随按钮。 但是,当我单击_follow.html.erb生成的按钮按钮时,当我调用@project.followers.count时,它似乎没有跟随项目或更新计数,因为POST没有发生。

因此,当我点击关注按钮时,url变得混乱。 见例子:

 #Goes from domain.com/projects/21 #to domain.com/projects/21?utf8=%E2%9C%93&authenticity_token=5EQmU0EkHB5yKDYakqL78piMWzZl0CfdpHFEqBeQiN4%3D&project_relationship%5Bprojectuser_id%5D=21&commit=Follow%22 

* *更新:它现在似乎工作,但我不确定我是否真的改变了什么,但摆脱了follower_id索引:unique => true通过迁移更改。

schema.rb

 create_table "project_relationships", :force => true do |t| t.integer "follower_id" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.integer "projectuser_id" end add_index "project_relationships", ["follower_id"], :name => "index_project_relationships_on_follower_id", :unique => true add_index "project_relationships", ["projectuser_id"], :name => "index_project_relationships_on_projectuser_id" 

的routes.rb

 resources :projects do resources :comments member do get :following end end resources :project_relationships, only: [:create, :destroy] 

project_relationship.rb

 class ProjectRelationship < ActiveRecord::Base attr_accessible :projectuser_id belongs_to :user, foreign_key: "follower_id" belongs_to :project, foreign_key: "projectuser_id" end 

project.rb

 has_many :project_relationships, foreign_key: "projectuser_id" has_many :favorited_by, through: :project_relationships, source: :user 

user.rb

 has_many :project_relationships, foreign_key: "follower_id" has_many :followed_projects, through: :project_relationships, source: :project def following_project?(project) project_relationships.find_by_follower_id(project.id) end def follow_project!(project) project_relationships.create!(projectuser_id: project.id) end def project_unfollow!(project) project_relationships.find_by_projectuser_id(project.id).destroy end 

project_relationships_controller.rb

 class ProjectRelationshipsController < ApplicationController def create @project = Project.find(params[:project_relationship][:projectuser_id]) current_user.follow_project!(@project) redirect_to @project end def destroy @project = ProjectRelationship.find(params[:id]).followed_project current_user.project_unfollow!(@project) redirect_to @project end end 

项目/ show.html.erb

  

项目/ _follow_form.html.erb

      

项目/ _follow.html.erb

  

项目/ _unfollow.html.erb

    

首先 – 如果您在控制台中运行projectfollow!(project)projectfollow!(project) (与用户,项目等),它们是否正常工作?

对于您的表单,请尝试以下代码,看看它是否有效:

 <%= form_for(current_user.project_relationships.build, url: project_relationships_path(project_id: @project.id)) do |f| %> 

然后在您的项目关系控制器中:

 class ProjectRelationshipsController < ApplicationController def create @project = Project.find(params[:project_id]) current_user.projectfollow!(@project) redirect_to @project end end 

因此,如果您的创建URL是/project_relationships (通过POST),上面应该发布到/project_relationships?project_id=5然后控制器可以找到该项目。

此外,尝试重命名您的方法,使它们有意义:

 def following_project?(project) end def follow_project!(project) end def unfollow_project!(project) end 

现在current_user.following_project?(project)很有意义!

更新

好的,我认为以下是问题,在你的create动作中你从params获得id:

 @project = Project.find(params[:project_relationship][:projectuser_id]) 

但是,在您的表单中,您没有设置隐藏字段的值:

 <%= f.hidden_field :projectuser_id %> 

将其更改为以下内容并查看其是否有效:

 <%= f.hidden_field :projectuser_id, value: @project.id %> # or wherever the id is from 

问题是我的跟随/取消跟随表单嵌入了导致错误的另一种forms。 一旦取出,工作!