множественный выбор

Я пытаюсь создать форму, которая позволяет назначать несколько участников проекта проекту. (Модель пользователя и проекта связана через 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 !!??

мои проекты_контроллер:

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

После создания одного экземпляра команда с использованием консоли: @project=Project.all дает: Идентификатор проекта: 55, имя проекта: "fdfd", описание проекта: "fdfd", заголовок проекта: "5", член проекта: nil, имя_проекта: "dffd ">]


person Matoeil    schedule 06.06.2012    source источник


Ответы (2)


Предполагая, что ваши ассоциации примерно такие:

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

... для формы вашего проекта используйте следующий помощник с параметром «имя» (:name=>'project[user_ids][]'), чтобы передать выбранные идентификаторы вашему контроллеру:

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

Это даст вам выбранные идентификаторы в параметрах, а затем вам нужно будет подключить действия вашего контроллера, чтобы назначить их. Например:

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. Не совсем уверен в этом. Альтернативой выполнению всего вышеперечисленного может быть использование флажков для выбора пользователей, поскольку флажок может быть установлен для каждого назначенного пользователя при отображении формы. Удачи.

person miked    schedule 06.06.2012
comment
Большое спасибо, это было очень полезно! - person Matoeil; 07.06.2012

моя модель действительно была такой:

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][]' %>

by

<%= 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">,

чему я рада :)

еще надо:

автоматически удалить пару проект/пользователь, если проект удален

показать на экране соответствующие имена участников, а не идентификационный номер...

person Matoeil    schedule 07.06.2012