0

私は、ユーザーが他のユーザーによって作成されたプロジェクトをフォローできるアプリケーションの構築に取り組んでいます ( 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 %>
4

2 に答える 2

0

まず第一に、実行projectfollow!(project)projectunfollow!(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アクションでは、パラメータから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
于 2013-04-22T07:52:48.580 に答える
0

問題は、フォロー/フォロー解除フォームが別のフォームに埋め込まれていたため、エラーが発生したことでした。取り出したら、うまくいきました!

于 2013-05-02T22:30:49.773 に答える