[英]When does a Ruby on Rails attribute get its methods?
我通過遷移向Ruby on Rails數據模型(Client)添加了一個屬性。 我在attr_accessible語句中將屬性(退伍軍人)添加到模型中。 我運行了遷移,因此該屬性顯示在db / schema.rb中。 我將該屬性添加到該特定對象的spec / factories工廠。
在模型的視圖中,我有這樣的事情:
<td><%= f.label :veteran %></td>
<% if @client.veteran %>
<td><%= f.radio_button :veteran, :true, :checked => true %>Yes</td>
<td><%= f.radio_button :veteran, :false %>No</td>
<% else %>
<td><%= f.radio_button :veteran, :true %>Yes</td>
<td><%= f.radio_button :veteran, :false, :checked => true %>No</td>
<% end %>
我的問題是:即使在控制器中,在新的,我做了Client.new,語句@ client.veteran給出了一個錯誤:NoMethodError:@client中未定義的方法老手
為什么ActiveRecord對退伍軍人的了解不會進入Client對象? 如何避免此錯誤? (我還應該補充說,在自動化測試中,Rspec和Cucumber中不會出現問題。)
UPDATE。 我現在明白我需要了
attr_accessor :veteran
但我不明白為什么其他屬性在“attr_accessible”(白名單)中似乎沒問題,但不是這個(這是新的)。
Steve Turczyn,控制器代碼只是@client = Client.new。 我很確定這是我看到的錯誤。 我顯然需要更好地理解attr_accessor與attr_accessible。
您不需要在ActiveRecord::Base
中使用attr_accessor
,Rails會自動為模式中的所有字段執行此操作。
您的視圖也只需要這樣:
<td><%= f.label :veteran %></td>
<td><%= f.radio_button :veteran, :true, checked: @client.veteran? %>Yes</td>
<td><%= f.radio_button :veteran, :false, checked: !@client.veteran? %>No</td>
至於你的問題
Ruby on Rails屬性何時獲取其方法?
答案是,在您運行遷移后,您已經可以訪問在其中創建的屬性。 如果出現類似錯誤,請重新啟動服務器,但不一定需要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.