我正在尝试使用复选框中的值填充数组。它在创建记录时工作得很好,但在编辑时验证失败。 params看起来正确,这让我感到困惑:
"record"=>{... "type_array"=>["accounting"], ...}
它与创建新记录时的参数相同。 New.html.erb
和Edit.html.erb
中的字段也使用相同的标记。
Edit.html.erb
<div class="field">
<%= f.label :type_array, "What type of record?" %><br />
<% ["accounting", "agriculture", "automotive"].each do |type| %>
<%= check_box_tag 'record[type_array][]', type, (true if @record.type_list.include? type),
:id => type %>
<%= label_tag type, type.titleize, :class => type %><br />
<% end %>
</div>
Record.rb的部分
validates :type_array, :presence => true
attr_accessor :type_array
attr_accessible :type_array
before_validation :set_type_list
private
def set_type_list
self.type_list = type_array.join ',' if type_array.present?
end
我错过了什么吗?当我删除type_array
验证并填写表单时,它的行为类似于type_array为空。沿着这条线的某个地方,它一定是丢失的东西。
我感谢任何帮助。
(旁注:如果有人有更好的方法来做复选框列表,请告诉我)
答案 0 :(得分:5)
删除第attr_accessor :type_array
行。
这为新的实例变量创建了访问器方法,而不是模型属性type_array
,这意味着@record.type_array
现在引用该实例变量而不是属性。
你几乎从未在Rails中使用attr_accessor
或它的兄弟attr_reader
和attr_writer
,因为你想要处理模型属性,而不是实例变量。
修改:您正在使用type_array
作为虚拟属性。
class Record < ActiveRecord::Base
validates :type_array, :presence => true
attr_accessible :type_array
def type_array=(val)
self.type_list = val.join ','
end
def type_array
self.type_list.split ','
end
def type_array_before_type_cast
type_array
end
end
由于您需要最后一个函数定义的原因,请参阅this question。