我正在尝试创建一个表单,允许组选择他们可以在系统中使用的多个模块。不幸的是,每次我尝试这个时,我都会遇到一些疯狂的关联错误,我不知道为什么。
以下是我的表单的代码
<%= form_for @group, :url => admin_groups_path, :html => { :class => 'entry' } do |f| %>
<%= render :partial => 'shared/error_messages', :locals => { :object => @group } %>
<div class="g12">
<fieldset>
<fieldset>
<legend>Add Group</legend>
<div class="simple_format">
<section class="g3">
<%= f.label :name %>
<div><%= f.text_field :name, :size => 15 %></div>
</section>
<section class="g3">
<%= f.label :is_facility, 'Facility?' %>
<div style="display:block;margin: 0 auto;width:25px;"><%= f.check_box :is_facility %></div>
</section>
<section class="g3">
<%= f.label :parent_id %>
<div style="display:block;margin: 0 auto;width:25px;"><%= f.collection_select :parent_id, current_group.self_and_descendants.reject(&:is_facility), :id, :name %></div>
</section>
<section class="g3">
<%= f.label :time_zone, 'Time Zone' %>
<div><%= f.select :time_zone, ActiveSupport::TimeZone.all.map(&:name).select {|x| x=~ /US/} %></div>
</section>
</div>
<div class="simple_format">
<section class="g3">
<%= f.label :federal_tax_number, 'Federal Tax ID' %>
<div><%= f.text_field :federal_tax_number, :size => 15 %></div>
</section>
<section class="g3">
<%= f.label :national_provider_identifier, 'National Provider ID' %>
<div><%= f.text_field :national_provider_identifier, :size => 15 %></div>
</section>
<section class="g3">
<%= f.label :modules, 'Allowed Modules' %>
<div><%= f.collection_select :group_access_modules, AccessModule.all, :id, :name, {}, {:multiple => true} %></div>
</section>
</div>
<section class="g12">
<div><%= f.submit "Add Group", { :class => 'form-submit' } %></div>
</section>
</fieldset>
</fieldset>
</div>
<% end %>
这是我的模特
class Group < ActiveRecord::Base
has_many :group_access_modules
end
以下是我保存的错误
<h1>
ActiveRecord::AssociationTypeMismatch
in Admin::GroupsController#create
</h1>
<pre>GroupAccessModule(#70245162706560) expected, got String(#70245155065480)</pre>
我现在完全迷失了。
答案 0 :(得分:0)
您是否尝试过使用simple_form?它使关联很容易,例如:
<%= f.association :company %>
显然,这使您的代码更易于阅读,而且非常易于配置。
还有railscast on habtm checkboxes,但这是一个修订过的剧集,我认为你需要订阅。
让我知道你对simple_form gem的看法
答案 1 :(得分:0)
您可以在表单中使用fields_for
作为关联。看起来应该是这样的:
<%= f.fields_for :group_access_modules do |g| %>
<%= g.collection_select(:group_id, AccessModule.all, :id, :name, {}, {:multiple => true} %>
<% end %>
注意:如果您使用非常规外键名称,可能需要更改方法(:group_id
)。