1

プロジェクトの作成元となるフォームがあります。フォームは 2 つのテーブルのデータを収集します。「プロジェクト」および「projects_users」。最後の 1 つは、プロジェクトのメンバーであるユーザー (フォームで選択) を格納するために使用されるリレーショナル テーブルです。

新しいプロジェクトの作成はうまくいきますが、「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
4

1 に答える 1

1

使用しているコントローラーでは、モデルProjects_users.newの新しいメソッドを意味し、Projects_usersHABTM 関連付けを使用しているため、結合モデルは存在しません。結合/関連付けモデルを使用する場合は、has_many :through関連付けを使用する必要があります。ただし、既存のユーザーをプロジェクトに関連付けるだけの場合は、次の方法で実行できます

@project.user_ids = @members

また

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

@member は、あなたの場合、ハッシュではなく配列になります。チェックされたすべてのユーザーの ID が含まれます。member.user_idハッシュではないので必要ありません。

于 2013-02-10T17:39:44.407 に答える