我通过迁移向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中不会出现问题。)
更新。我现在明白我需要
attr_accessor :veteran
但我不明白为什么其他属性在“attr_accessible”(白名单)中似乎没问题,但不是这个(这是新的)。
Steve Turczyn,控制器代码只是@client = Client.new。我很确定这是我看到的错误。 我显然需要更好地理解attr_accessor与attr_accessible。
答案 0 :(得分:0)
您在attr_accessor
中不需要ActiveRecord::Base
,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属性何时获取其方法?
答案是,在您运行迁移后,您已经可以访问在其中创建的属性。如果出现类似错误,请重新启动服务器,但不一定非必要。