1

我正在尝试为 has_many 关系创建自定义部分并遇到一些问题。

我的模型

Message
has_many :formats

Format
belongs_to :message
validates_inclusion_of :format_type, :in => FORMAT_TYPES.keys

我有一个常量“FORMAT_TYPES”(wmv、flv 等),因此每个“格式”记录都有一个 message_id 和一个 format_type 字符串,它们在允许的列表中。

我正在尝试为 rails_admin 创建一个自定义部分,允许管理员使用复选框来选择他们想要的格式。这是我所拥有的:

- for format in FORMAT_TYPES.keys
  %div
    = check_box_tag "message[formats][]", format
    = format

哪个输出:

<fieldset>
   <legend>Formats</legend>
   <div>
  <input id="message_formats_" name="message[formats][]" type="checkbox" value="640x360_8">
  640x360_8
</div>
<div>
  <input id="message_formats_" name="message[formats][]" type="checkbox" value="480x272_8">
  480x272_8
</div>
...
</fieldset>

当我选择几种格式并提交时,我收到此错误:

ActiveRecord::AssociationTypeMismatch in RailsAdmin::MainController#create

Format(#2196273220) expected, got String(#2151941320)

这听起来像是在期待一个现有的 Format id。这让我觉得我必须创建一个 has_many_through 并摆脱我的常量。(试图避免这种情况)

试图弄清楚如何正确格式化我的部分以允许创建这些新的格式记录。有任何想法吗?

非常感谢提前!

4

2 回答 2

2

我有一个类似的问题:我想在has_many/belongs_tohas_and_belongs_to_many关联中有一个部分,它将使用复选框(复选框组)而不是默认表单小部件。

我做了一个扩展(=自定义视图部分)rails_admin允许轻松使用相关模型的复选框组小部件。

这不完全是您的用例 (您有一种枚举复选框组),但您可以从我的模板中获得灵感,就像 中的所有模板一样rails_admin,即使这个我的模板也在 HAML 中

- selected_ids = (hdv = field.html_default_value).nil? ? selected_ids : hdv
- n = 3
- data = []
- all_values.sort {|x, y| x[0] <=> y[0] }.each_with_index do |item, index|
  - (0..(n-1)).each do |p|
    - data[p] ||= []
    - data[p] << item if index % n == p
- data.each_with_index do |slice, c|
  %div{:class => [:column, "col-#{c}"]}
    - slice.each do |item|
      %div.checkbox_field
        = check_box_tag "#{form.dom_name(field)}", item[1], selected_ids.include?(item[1]), {:id => "#{field.method_name}_#{item[1]}"}
        %label{:for => "#{field.method_name}_#{item[1]}"}
          = item[0]

其他解决方案是使用默认rails_admin枚举功能https://github.com/Juicymo/rails_admin/wiki/Enumeration),只需将其部分模板更改为使用复选框,而不是添加自定义内容和表单。

如果感兴趣,模板和rails_admin复选框组关联小部件扩展在GitHub上开源:https ://github.com/Juicymo/rails_admin/blob/master/app/views/rails_admin/main/_form_checkboxes_multiselect.html.haml

于 2012-09-28T20:01:35.837 回答
1

The problem is that format is an object and you are passing in the string value of format. You can use format_ids instead of format.

= check_box_tag "message[format_ids][]", format.id

In order to allow for no formats (if you want them to be able to save no formats), you will also need to add a dumby hidden field:

= hidden_field_tag "message[format_ids][]", 0
于 2011-06-24T15:08:05.037 回答