我正在尝试为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并摆脱我的常数。 (试图避免这种情况)
试图弄清楚如何正确格式化我的部分以允许创建这些新的格式记录。有什么想法吗?
提前多多谢谢!
答案 0 :(得分:2)
我遇到了类似的问题:我希望在has_many
/ belongs_to
或has_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