【问题标题】:I have somehow broken my Rails app - the dreaded NoMethod Error我以某种方式破坏了我的 Rails 应用程序 - 可怕的 NoMethod 错误
【发布时间】:2013-08-18 04:23:53
【问题描述】:

错误消息是NoMethodError in Circuit#updateundefined method 'network_address' for nil:NilClass,在我看来与这一行有关:

<td><%= logical_interface.subnet.network_address %></td>

之前一切正常,现在我在重新启动本地服务器时设法破坏了它。

update.rhtml

<table id="logical_interfaces">
    <% @logical_interfaces.each do |logical_interface| %>
        <tr id="logical_interface_<%= logical_interface.id %>">
            <td><%= logical_interface.description %></td>
            <td><%= logical_interface.subnet.network_address %></td>
            <td><%= logical_interface.bandwidth %></td>
            </td>
        </tr>
    <% end %>
</table>

logical_interface.rb

belongs_to :subnet
belongs_to :circuit

subnet.rb

belongs_to :logical_interface
belongs_to :circuit

电路.rb

has_many :subnets
has_many :logical_interfaces

电路控制器.rb

CRUD 正在另一个模型的控制器内完成,因为这是其他一切运行的主要对象。

def update

  ....
  if params[:id]
    @circuit = Circuit.find(params[:id])
  end

  @logical_interfaces = LogicalInterface.find_all_by_circuit_id(@circuit.id)
  ....

end

与错误一样常见,我敢打赌这很愚蠢,但我真的无法为自己解决问题,因此非常感谢任何答案。我感觉这与模型之间定义的关系有关,但我可能是错的。

【问题讨论】:

  • 您的一条记录logical_interface 没有与之关联的子网,因此当调用logical_interface.subnet.network_address 时,它会引发“Nil 没有'network_address' 方法”=> 使用logical_interface.subnet.try(:network_address) 来查看如果逻辑接口应该强制使用子网,则哪条记录已损坏并添加验证子网模型上的存在。
  • logical_interface.subnet 为零,可能是因为该记录没有与之关联的子网。你得到这个错误是因为你试图调用一个 nil 对象的方法,而 Nil 对象没有那个方法。
  • 谢谢,会尝试进一步挖掘,我一定从数据库中删除了一些东西......

标签: ruby-on-rails ruby ruby-on-rails-2


【解决方案1】:

subnetnil 对应于 logical_interface。在LogicalInterface 模型中添加一些验证:

validates_presence_of :subnet

或仅当存在subnet 时才显示network_address

<td><%= logical_interface.subnet.try(:network_address) %></td>

【讨论】:

  • 谢谢,这让我可以渲染页面并看到子网确实是空的,但不确定它是如何变成这样的。
猜你喜欢
  • 2015-08-11
  • 1970-01-01
  • 2011-07-09
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-28
  • 1970-01-01
相关资源
最近更新 更多