validates_inclusion_of始终在静态数据上失败

时间:2011-08-07 04:34:28

标签: ruby ruby-on-rails-3 validation

我在尝试实现伪枚举字段时使用rails 3.1.0.rc5。

我正在尝试验证绑定到静态列表的字段的值。不幸的是,它总是无法验证。

型号代码>

STATUSES = %w( pending active completed )
  validates_inclusion_of :status, :in => STATUSES, :on => :create, :message => "%{value} must be one of #{STATUSES.join ', '}"

表单标记>

 <div class="field">
    <%= f.label :status %><br />
    <%= select_tag :status, options_for_select(Task::STATUSES, @task.status) %>
  </div>

遗憾的是,状态的验证例程总是失败。查看帖子数据,它包含一个值,它是有效的..所以我不确定发生了什么?

我已尝试根据一些谷歌搜索添加以下内容

def status=(value)
    write_attribute(:status, value.to_s)
  end

  def status
    attributes = attributes_before_type_cast
    if attributes["status"]
      read_attribute(:status).to_sym
    else
      nil
    end
  end

然而,似乎永远不会调用status =(setter)。

谢谢!

2 个答案:

答案 0 :(得分:0)

我不知道如果不看你的控制器,但我假设你的控制器正在做类似的事情:

# I'm naming the model User but this would be the name of the model you're using
@user = User.create(params[:user])

您的表单会发布如下内容:

{ :status => 'pending' }

何时应将状态置于用户哈希中,如下所示:

{ :user => { :status => 'pending' } }

您需要更改表单以正确发布属性:

          

答案 1 :(得分:0)

我认为您的问题与select标签有关。您必须使用select帮助程序才能在调用User.new(params [:user])或类似内容时调用您的setter。