我在尝试实现伪枚举字段时使用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)。
谢谢!
答案 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。