2013-02-10 58 views
1

我有一個創建項目的窗體。該表格收集兩個表格的數據; 'projects'和'projects_users'。最後一個 是一個關係表,用於存儲哪些用戶是項目成員(在表單中選擇)。在數據庫中創建帖子時發生問題

創建一個新的項目工作正常,但是當涉及到創造「projects_users」它沒有新的職位:

uninitialized constant ProjectsController::Projects_users 

首先,我在正確的方式思考(見下面的代碼) ?

我所做的是我從params [:project]中提取成員數組,這是從表單中檢索的。然後我在數據庫中創建項目,當完成後,我遍歷成員數組(其中包含user_id)並在數據庫中爲'projects_users'創建帖子。

我在做什麼錯?有沒有更好的方法來實現我想要的?

項目控制器:

class ProjectsController < ApplicationController 
def new 
    @project = Project.new 
    @users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id])) 
end 

def create 
    @members = params[:project].delete(:members) 
    @project = Project.new(params[:project].merge(:user_id => current_user.id)) 

    if @project.save 
    @members.each do |member| 
     @project_members = Projects_users.new 
     @project_members.project_id = @project.project_id 
     @project_members.user_id = member.user_id 
    end 

    redirect_to @project 
    else 
    @users = (current_user.blank? ? User.all : User.find(:all, :conditions => ["id != ?", current_user.id])) 
    render :new 
    end 
end 
end 

new.html.erb:

<%= form_for @project do |f| %> 
<div class="alert alert-block"> 
    <%= f.error_messages %> 
</div> 
<div class="text_field"> 
    <%= f.label :title%> 
    <%= f.text_field :title%> 
</div> 
<div class="text_field"> 
    <%= f.label :description%> 
    <%= f.text_field :description%> 
</div> 
<div class="dropdown"> 
    <%= f.label :start_date%> 
    <%= f.date_select :start_date %> 
</div> 
<div class="dropdown"> 
    <%= f.label :end_date%> 
    <%= f.date_select :end_date %> 
</div><br/> 
<span class="help-block">Välj användare som ska ingå ingå i projektet.</span> 
<div class="checkbox"> 
    <% @users.each do |user| %> 
     <%= check_box_tag "project[members][]", user.id, '1', :id => "user_#{user.id}" %> 
     <%= label_tag "user_#{user.id}", user.first_name + ' ' + user.last_name, :class => "checkbox" %> 
    <% end %> 
</div> 
</div> 
<div class="submit"> 
    <%= f.submit "Spara" %> 
</div> 
<% end %> 

項目模型:

class Project < ActiveRecord::Base 
    has_and_belongs_to_many :users, :class_name => 'User' 

    belongs_to :user 
    has_many :tickets, :dependent => :destroy 

    // validation... 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :user_id, :title, :description, :start_date, :end_date 
end 

個用戶模式:

class User < ActiveRecord::Base 
    attr_accessible :first_name, :last_name, :email, :password 

    has_and_belongs_to_many :projects 
    has_many :tickets 

    ... other code 

end 

projects_users表:

project_id 
user_id 

項目表:

user_id (the user that creates the project = admin) 
title 
description 
start_date 
end_date 

回答

1

在您使用Projects_users.new控制器,這意味着爲Projects_users新方法模型和你是你唱HABTM協會的連接模式不存在。如果你想使用加入/關聯模型,那麼你必須使用has_many :through關聯。但如果你只是想關聯已有的用戶,你可以做到這一點的項目下列方式

@project.user_ids = @members 

OR

@members.each do |member| 
    user = User.find(member) 
    @project.users << user 
end 

@member會在你的情況下,陣列不是哈希。它將包含所有檢查過的用戶的ID。所以你不需要有member.user_id,因爲它不是一個散列。

+0

非常感謝您的回答!在你的解決方案中,projects_users表在哪裏使用? @ project.user_ids是指項目表,而不是我假設的'project_users'?項目表中的字段user_id僅存儲項目創建者的user_id。 – holyredbeard 2013-02-10 17:50:42

+1

是的,這是鐵路協會的魔力。它只是添加這些user_ids加入/關聯表,在這種情況下,它是projects_users。 :) – 2013-02-10 18:00:54

+0

啊,真的很酷!會立即嘗試一下!:) – holyredbeard 2013-02-10 21:15:14