Ruby on Rails属性何时获取其方法?

时间:2015-08-21 20:27:36

标签: ruby-on-rails ruby-on-rails-4

我通过迁移向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。

1 个答案:

答案 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属性何时获取其方法?

答案是,在您运行迁移后,您已经可以访问在其中创建的属性。如果出现类似错误,请重新启动服务器,但不一定非必要。