繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM