2016-04-09 81 views
0

我想要實現的是:當一個對象在新動作中產生時,我想爲模型中的一個屬性指定一個默認值,但是在編輯動作中,當然我想使用已經輸入的值。請看下面的簡化模型爲例:如何向RoR模型中的屬性添加默認值?

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.我試圖通過執行<%= f.text_field :salary, :value => 100000 %>將值設爲note 1,但問題出在編輯操作中,它也使用此值,這不是所期望的。

+0

'<%= f.text_field:工資,值:(?@ person.new_record 100000:@ person.salary)%>' - 確實這有道理嗎? – dp7

+0

這將是我最後的手段,但是正在考慮RoR考慮過這種情況。爲什麼不把它變成一個普通的答案? – TimeString

+0

爲您做了這項工作? – dp7

回答

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

由於@Kristjan曾建議,你可以在你的數據庫的默認值或控制器內初始化。

可以在視圖處理這種如下:

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