1

我正在尝试为“创意”模型添加“大小”属性的验证。“创意”模型与“广告”是一一对应的,其字段以嵌套形式显示在“广告”表单中(代码如下)。

问题是,当我实际保存表单时,不会验证大小 - 既没有使用格式验证器,也没有使用 :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 %>
4

0 回答 0