我正在尝试为“创意”模型添加“大小”属性的验证。“创意”模型与“广告”是一一对应的,其字段以嵌套形式显示在“广告”表单中(代码如下)。
问题是,当我实际保存表单时,不会验证大小 - 既没有使用格式验证器,也没有使用 :presence 验证器(如果我添加一个)。同时验证 :filter 属性。
Size 是一个非模型属性,添加了 attr_accessor 方法和自定义 setter 和 getter。
寻找修复此代码的方法或任何不同的解决方案来为非模型嵌套属性添加验证将不胜感激。
控制器:
class Creative < ActiveRecord::Base
attr_accessible :size, :filter
belongs_to :ad
attr_accessor :size
validates :size, :format => { :with => /^\d+x\d+$/, :message => "Incorrect size param. Should be [width]x[height], e.g. 320x50" }
validates :filters, :presence => true
def size
"#{self.width}x#{self.height}"
end
def size=(size)
@width, @height = size.split("x").map(&:to_i)
end
end
class Ad < ActiveRecord::Base
attr_accessible :creative_attributes
has_one :creative
accepts_nested_attributes_for :creative
validates_associated :creative
end
class Campaign < ActiveRecord::Base
has_many :ads
end
形式:
<%= simple_form_for [:rtb, @campaign, @ad], :html => { :class => 'form-horizontal' } do |f| %>
<% if @ad.errors.any? %>
<div id="error_explanation" class="alert alert-error">
<h2><%= pluralize(@ad.errors.count, "error") %> prohibited this ad from being saved:</h2>
<ul>
<% @ad.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<%= f.input :name %>
<%= f.simple_fields_for :creative do |creative_f| %>
<fieldset>
<legend>Creative Settings</legend>
<%= creative_f.input :size %>
<%= creative_f.input :filters %>
</fieldset>
<% end %>
<%= f.button :submit, :class => 'btn-primary' %>
<% end %>