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)
4

1 回答 1

2
<% @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 %>

更新:

check_box_tag 的第二个参数user.id是复选框的值,第三个@project.member_ids.include?(user.id)是复选框是否选中。你可以在这里阅读更多关于它的信息。

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)

您可以阅读此处了解详细信息。

于 2013-02-10T10:23:42.137 回答