1

複数のプロジェクトメンバーをプロジェクトに割り当てることができるフォームを作成しようとしています。(UserProjectを介して関連付けられているユーザーモデルとプロジェクトモデル)

これが私の見解です:

<div class="field">
<%= fields_for :projectmember do |u| %> 
  <%= u.label :projectmember %><br />
  <%= select_tag :projectmember, options_for_select(User.all.collect {|u| [u.id, u.lastname]}, :projectmember),:multiple => true, :prompt => 'Select Person' %>

<% end %>
  </div>

projectmemberタグをあちこちに配置しましたが、このフィールドprojectmemberをdbプロジェクトとuser_projectsに保存する方法がわかりません!! ??

私のprojects_controller:

def new
@project = Project.new
@user_project=UserProject.new
@user=User.all    
@user_lastnames = User.all.collect do |u| 
  u.lastname
end

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @project }
end
end

def create
@project = Project.new(params[:project])  

respond_to do |format|
  if @project.save
    format.html { redirect_to @project, notice: 'Project was successfully created.' }
    format.json { render json: @project, status: :created, location: @project }         

    @user_project=UserProject.create(:project_id => @project.id, :user_id => @project.projectmember)       

  else
    format.html { render action: "new" }
    format.json { render json: @project.errors, status: :unprocessable_entity }
  end
end
end

1つのインスタンスを作成した後、コンソールを使用するコマンド:@ project = Project.allは次のようになります:Project id:55、projectname: "fdfd"、projectdescription: "fdfd"、projectheader: "5"、projectmember:nil、projecttypename: "dffd ">]

4

2 に答える 2

1

関連付けが次のようなものであると仮定します。

class Project < ActiveRecord::Base
  has_many :project_users
  has_many :users, :through=>:project_users
end

...プロジェクト フォームでは、次のヘルパーを "name" オプション(:name=>'project[user_ids][]')と共に使用して、選択した ID をコントローラーに渡します。

<%= select_tag :user_ids, options_for_select(User.all.collect {|u| [u.lastname, u.id]}),:multiple => true, :prompt => 'Select Person', :name=>'project[user_ids][]' %>

これにより、選択した ID が params で取得され、コントローラー アクションを接続してそれらを割り当てる必要があります。例えば:

def create
    @project = Project.new(params[:project])  
    users = User.find(params[:project][:user_ids]) rescue []
    @project.users = users
    if @project.save
      ...
    else
      ...
    end
end

def update
    @project = Project.find(params[:id])
    users = User.find(params[:project][:user_ids]) rescue []
    @project.users = users
    if @project.update_attributes(params[:project])
      ...
    else
     ...
    end
end

編集フォームをレンダリングするときに選択したアイテムを再選択するには、それを options_for_select メソッドに引数として追加する必要があると思います。それについては正確にはわかりません。上記のすべてを実行する代わりに、チェックボックスを使用してユーザーを選択することもできます。これは、フォームがレンダリングされるときに、割り当てられたユーザーごとにチェックボックスを設定できるためです。幸運を。

于 2012-06-06T21:15:41.820 に答える
0

私のモデルは確かにそのようなものでした:

class Project < ActiveRecord::Base
  has_many :project_users
  has_many :users, :through=>:project_users

  attr_accessible :colourcode, :projectdescription, :user_id, :projectname, :projectheader, :projectmember, :projecttypename
end

ビューを変更する必要があります(そうでない場合、保護された属性を一括割り当てできません):

    <%= select_tag :user_ids, options_for_select(User.all.collect {|u| [u.lastname, u.id]}),:multiple => true, :prompt => 'Select Person', :name=>'project[user_ids][]' %>

<%= select_tag :projectmember, options_for_select(User.all.collect {|u| [u.lastname, u.id]}),:multiple => true, :prompt => 'Select Person', :name=>'project[projectmember][]' %>

そして私のコントローラーでは:

def create
@project = Project.new(params[:project])  

users = User.find(params[:project][:projectmember]) rescue []
@project.users = users    



respond_to do |format|
  if @project.save
    format.html { redirect_to @project, notice: 'Project was successfully created.' }
    format.json { render json: @project, status: :created, location: @project }         

   @user_project=UserProject.create(:project_id => @project.id, :user_id => @project.projectmember)
    @user_project=UserProject.create(:project_id => @project.id, :user_id => @project.projectheader)

私は作成後に今得ました:

@p=Project.all

 Project id: 69, projectname: "test", projectdescription: "blabla", colourcode: "blue", projectheader: "5", projectmember: "---\n- '5'\n- '6'\n", projecttypename: "caucasian">]


@up=UserProject.all


UserProject id: 86, project_id: 69, user_id: 5, created_at: "2012-06-07 13:04:51", updated_at: "2012-06-07 13:04:51">

UserProject id: 87, project_id: 69, user_id: 6, created_at: "2012-06-07 13:04:51", updated_at: "2012-06-07 13:04:51">,

私はこれについて満足しています:)

まだする必要があります:

プロジェクトが削除された場合、プロジェクトとユーザーのカップルを自動的に削除します

ID番号ではなく、対応するメンバー名を画面に表示します。

于 2012-06-07T13:37:51.087 に答える