2013-02-10 179 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返回所有關聯對象的ID的數組的方法。既然我們要命名協會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

非常感謝您的回答。但是,當試用代碼時,我得到以下錯誤:未定義的方法'member_ids'...你知道爲什麼嗎?你能爲我解釋「user.id,@ project.member_ids.include?(user.id)」嗎? – holyredbeard 2013-02-10 12:06:45

+0

您是否設置了has_and_belongs_to_many關聯並檢查了它是否正確並正常工作?我更新了我的答案。 – 2013-02-10 12:35:08