2011-08-07 13 views
2

我在尝试实现伪枚举字段时使用了rails 3.1.0.rc5。validates_inclusion_of在静态数据上始终失败

我想验证绑定到静态列表的字段的值。不幸的是它总是无法验证。

型号代码>

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 

然而,状态=(二传)似乎永远不会被调用。

谢谢!

回答

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' } } 

你会想改变你的形式正确地发布属性:


+0

非常感谢你......我正在查看帖子数据,但没有看到状态字段前的右大括号......它已经很晚了= \ 这帮助我解决了另一个问题,那就是我有太多..谢谢! – Mike

+0

只是为了防止任何人有选择处理相关字段..这似乎对我最有效 <%= collection_select(:task,:assigned_to,User.all,:id,:name, :prompt =>'请选择用户')%> – Mike

0

我认为你的问题是关系到选择标签。当你调用User.new(params [:user])或类似的东西时,你必须使用select助手来调用setter。