2012-06-28 2 views
2

많은 사용자에게 has_and_belongs_to _ 많은 사용자가있는 프로젝트 모델에 대해 M : N 관계를 만들려고합니다. 사용자는 많은 프로젝트에 참여할 수 있지만 프로젝트에도 많은 사용자가 있습니다. 내 조인 테이블에 다른 열이 없기 때문에 원인이 필요 없다고 생각합니다. (: 프로젝트 와 has_and_belongs_to_many : has_and_belongs_to_many 사용자)Ruby on Rails 3 : 새로운 컨트롤러 액션을 사용하는 HABTM

그래서 난 내 두 모델 협회를 포함하여 새로운 마이그레이션 설정 :

일하고
class AddProjectsUsersTable < ActiveRecord::Migration 
    def self.up 
    create_table :projects_users, :id => false do |t| 
     t.references :project, :user 
    end 
    end 

    def self.down 
    drop_table :projects_users 
    end 
end 

.. 내가 옆에 있는지 모르겠어요를 일들이 옳은지 아닌지 - 그러나 나는 무언가를 시도했습니다. 사용자 컨트롤러에서 프로젝트에 대한이 사용자와의 관계를 설정할 수있는 새 작업을 만들려고했습니다.

def joinProject 
    @user = current_user 
    @user.projects = Project.find(params[:id]) 

    respond_to do |format| 
     format.html { redirect_to @project, notice: 'Successfully joined project.' } 
     format.json { head :no_content } 
    end 
    end 

그것이 말하는 원인 그것은 아마도 잘못된 방법입니다 : "undefined method 'each' for #<Project:0x00000103f10028>"

나는 다른 사람이 관계를 설정하는 방법 ? 이 HABTM 관계가 어떻게 작동하는지 이해하지 못했던 것 같습니다.

아무도 도와 줄 수 있습니까? ;

흥미 롭거나 잘못 될 수있는 일부 추가 정보)

나는이 경로 생성 :

match "joinProject_user/:id" => "users#joinProject", :as => :joinProject 

를 다음과 같이 내보기에서 컨트롤러의 액션을 호출 :

<%= link_to 'Join', joinProject_path(project) %> 

답변

2

컨트롤러 동작의 두 번째 줄은 다음과 같아야합니다.

@user.projects += [Project.find(params[:id])] 
,

또는

@user.project_ids += [params[:id]] 

이 기존 프로젝트 컬렉션에 전달 된 프로젝트를 추가합니다. User#projects= 메서드 (habtm 연결에 의해 정의 됨)는 Project 개체가 아닌 컬렉션을 필요로합니다. 내부적으로 프로젝트는 each에 응답하지 않으므로 each에 전화를 걸므로 실패합니다.

+0

그게 효과가 있습니다 - 정말 고마워요! – cruxi

관련 문제