Ruby on Rails表单中模型字段的默认值

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)


raw*_*ack 5

我可以确认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时,从界面的角度来看是不显眼的