如何在RoR模型中为属性添加默认值?

时间:2016-04-09 18:19:54

标签: ruby-on-rails

我想要实现的目标如下:当一个对象在新操作中生成时,我想为模型中的一个属性分配一个默认值,但在编辑操作中,当然我想使用已经输入的值。以下面的简化模型为例:

class Person < ActiveRecord::Base
  validates :salary, :presence => true
  validates :rank, :presence => true
end

_form.html.erb

<%= form_for(@person) do |f| %>
    <%= f.text_field :salary %>  # note 1
    <%= f.hidden_field :rank %>
<%= end %>

如果这是在新动作中(即,我将创建此人物对象),我想将工资和等级设置为特定值。 (假设排名可能会更改为默认值以外的值。)但在编辑操作中,我只想显示以前存储的对象值。这样做的好习惯是什么?

P.S。我试图通过实施note 1<%= f.text_field :salary, :value => 100000 %>行添加一个值,但问题出在编辑操作中,它也使用了这个值,这是不希望的。

2 个答案:

答案 0 :(得分:1)

有两种方法我建议这样做。第一种是在初始化对象时在控制器中设置默认值。这样,对于newedit,视图的行为方式可以相同。

class PeopleController < ApplicationController
  def new
    @person = Person.new(salary: 100000)
  end

  def edit
    @person = Person.find(params[:id])
  end
end

现在您的视图不需要知道默认值,它只是使用记录中设置的值。

如果要在数据库中设置足够稳定的默认值,Rails将在初始化对象时使用该值。您的迁移将如下所示:

class CreatePeople < ActiveRecord::Migration
  def up
    create_table :people do |t|
      t.integer :salary, default: 100000, null: false
    end
  end
end
Person.new
#=> #<Person:0x000000 salary: 100000>

答案 1 :(得分:1)

正如@Kristjan建议的那样,您可以在数据库中使用默认值或在控制器中初始化它。

您可以按照以下方式处理此问题:

<%= f.text_field :salary, value: (@person.new_record? ? 100000 : @person.salary) %>