Cal*_*ers 4 ruby database ruby-on-rails ruby-on-rails-3
我有一个Model
领域username, data, tags, date, votes
.我有表单使用form_for
,它创建一个新项目并将其放入数据库.但是,您可以猜测我希望投票字段等于0,并且日期字段等于放入数据库时的当前日期.如何以及在何处将这些值设置/应用于项目?
我可以让它与表单中的隐藏字段一起工作,但这带来了明显的问题(有人可以将votes
字段设置为大量数字).
edg*_*ner 10
只需使用默认值; 零,对于数据库中的投票,使用自动时间戳(created_at
)而不是date
,并且表单中的字段仅适用于您将设置的参数.不要忘记保护敏感属性.
class CreateModels < ActiveRecord::Migration
def up
create_table :models do |t|
t.string :username
t.text :data
t.string :tags
t.integer :votes, :default => 0
t.timestamps # this will give you two automatic fields: created_at and updated_at
end
end
…
end
class Model < ActiveRecord::Base
attr_protected :votes #so that it cannot be set by mass assignment
…
end
Run Code Online (Sandbox Code Playgroud)
我可以确认DB约束方法是最好的方法之一.但并不总是可以使用.假设存在单个表继承,并且每个子模型需要不同的默认值.比我建议把它放到模型中.让我举个例子:
class ChildModel < Model
after_initialize :set_defaults
private
def set_defaults
self.allowed_votes_per_person = 10 if self.new_record?
end
end
Run Code Online (Sandbox Code Playgroud)
通过使用:after_initialize回调,不需要创建和记住调用:new_default类似方法等.它设置了所需的默认值,但是当调用ChildModel.new时,从界面的角度来看是不显眼的
归档时间: |
|
查看次数: |
8860 次 |
最近记录: |