我想要实现的目标如下:当一个对象在新操作中生成时,我想为模型中的一个属性分配一个默认值,但在编辑操作中,当然我想使用已经输入的值。以下面的简化模型为例:
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 %>
行添加一个值,但问题出在编辑操作中,它也使用了这个值,这是不希望的。
答案 0 :(得分:1)
有两种方法我建议这样做。第一种是在初始化对象时在控制器中设置默认值。这样,对于new
和edit
,视图的行为方式可以相同。
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) %>