私は、ユーザーが他のユーザーによって作成されたプロジェクトをフォローできるアプリケーションの構築に取り組んでいます ( Michael Hartl の第 11 章に従っています)。
ユーザー用の follower_id とプロジェクト用の projectuser_id という 2 つのコンポーネントを保持する ProjectRelationship モデルを作成しました。外部キーはそのように設定されています。
現在、プロジェクト_follow_form.html.erb
をフォローしているかどうかに応じて、私のページは「フォロー」または「フォロー解除」をレンダリングしますcurrent_user
。以下の私のコードを見て、私が欠けているものを見てください。
現在、各プロジェクトのショーページにフォローボタンが生成されています。しかし、によって生成されたボタン フォロー ボタンをクリックすると、POST が発生し_follow.html.erb
ていないため、呼び出し時にプロジェクトをフォローしたり、カウントを更新したりしないようです。@project.followers.count
そのため、フォローボタンをクリックすると、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 index :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"
ルート.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
<%= render 'follow_form' if signed_in? %>
プロジェクト/_follow_form.html.erb
<% if current_user.following_project?(@project) %>
<%= render 'unfollow' %>
<% else %>
<%= render 'follow' %>
<% end %>
プロジェクト/_follow.html.erb
<%= form_for(current_user.project_relationships.build(projectuser_id: @project.id)) do |f| %>
<div><%= f.hidden_field :projectuser_id %></div>
<%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>
プロジェクト/_unfollow.html.erb
<%= form_for(current_user.project_relationships.find_by_projectuser_id(@project),
html: { method: :delete }) do |f| %>
<%= f.submit "Unfollow", class: "btn btn-large" %>
<% end %>