2013-02-10 3 views
1

Я хочу динамически создавать флажки в форме с использованием массива с пользователями. Значение, которое должно быть сохранено в массиве (param [: project] [: members]), должно содержать user_id из всех щелкнутых флажков с пользователями.Динамическое создание флажков

Я много искал, но еще не нашел то, что искал.

Какой код следует писать для флажков?

Форма в виду:

<%= form_for @project do |f| %> 
    <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> 
    <div class="checkboxes"> 
     <% @users.each do |user| %> 
      // <%= check_box_tag "users[]", user.id %> <--- ??? 
     <% end %> 
    </div> 
    <div class="submit"> 
     <%= f.submit "Spara" %> 
    </div> 
<% end %> 

Контроллер:

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

визуализации HTML:

[ ] Jules Smith // user_id: 1 
[X] Carl Jones  // user_id: 2 
[X] Lily Stevens // user_id: 3 

// param[:project][:members] // <-- 2, 3 (user_id's) 

ответ

1
<% @users.each do |user| %> 
    <%= check_box_tag "project[members][]", user.id, checked_or_not, :id => "user_#{user.id}" %> 
    <%= label_tag "user_#{user.id}", user.name_login_or_smth_else %> 
<% end %> 

Замените checked_or_not кодом, который указывает, что user.id уже находится в массиве элементов. Например, если вы установили has_and_belongs_to_many связь между проектами и пользователями, как это:

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

затем образуют бы:

<% @users.each do |user| %> 
    <%= check_box_tag "project[member_ids][]", user.id, @project.member_ids.include?(user.id), :id => "user_#{user.id}" %> 
    <%= label_tag "user_#{user.id}", user.name_login_or_smth_else %> 
<% end %> 

UPDATE:

Второй аргумент check_box_tag user.id это значение флажка, третья @project.member_ids.include?(user.id) флажок установлен или нет. Вы можете узнать больше об этом here.

has_and_belongs_to_many добавляет метод collection_ids, который возвращает массив всех идентификаторов связанных объектов. Так как мы хотим назвать ассоциацию members мы создаем ассоциацию с class_name вариант:

has_and_belongs_to_many :members, :class_name => 'User' 

collection_ids и метод становится member_ids. Таким образом, флажок @project.member_ids.include?(user.id) установлен, если участники уже включают пользователя и не проверены в противном случае.

С другой ваш вопрос, я могу предположить, что вы установили связь, как это:

has_and_belongs_to_many :users 

Затем он добавит user_ids метод и в форме, вы должны использовать

check_box_tag "project[user_ids][]", user.id, @project.user_ids.include?(user.id) 

Вы можете прочитать here для деталей ,

+0

Большое спасибо за ответ. Однако при проверке кода я получаю следующую ошибку: undefined method 'member_ids 'для ... Знаете почему? Не могли бы вы объяснить «user.id, @ project.member_ids.include? (User.id)» для меня? – holyredbeard

+0

У вас установлена ​​ассоциация has_and_belongs_to_many и проверено, что это правильно и работает? Я обновил свой ответ. –

Смежные вопросы