Rails管理员:belongs_to的自定义部分

时间:2011-06-24 14:47:56

标签: ruby-on-rails rails-admin

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

我的模特

Message
has_many :formats

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

我有一个常量“FORMAT_TYPES”(wmv,flv等等),以便每个“Format”记录都有一个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)

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

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

提前多多谢谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

问题是format是一个对象,你传入的是format的字符串值。您可以使用format_ids而不是format。

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

为了不允许任何格式(如果你希望它们不能保存任何格式),你还需要添加一个dumby隐藏字段:

= hidden_field_tag "message[format_ids][]", 0