【发布时间】:2017-10-20 01:17:58
【问题描述】:
我有这些型号和控制器代码:
class Item < ActiveRecord::Base
has_many :receivers_collateral_items, through: :received_trades, source: :wanted_item
has_many :receivers_wanted_items, through: :received_trades, source: :collateral_item
has_many :requesters_collateral_items, through: :requested_trades, source: :collateral_item
has_many :requesters_wanted_items, through: :requested_trades, source: :wanted_item
validates :year, :price, presence: true, numericality: true
validates :shares, numericality:
{ only_integer: true, greater_than_or_equal_to: 0,
less_than_or_equal_to: :build_shares }
accepts_nested_attributes_for :receivers_collateral_items, :receivers_wanted_items,
:requesters_collateral_items, :requesters_wanted_items,
allow_destroy: true
end
class Trade < ActiveRecord::Base
belongs_to :trade_requester, class_name: "User"
belongs_to :trade_recipient, class_name: "User"
belongs_to :wanted_item, class_name: "Item"
belongs_to :collateral_item, class_name: "Item"
validates :trade_requester, :trade_recipient, :wanted_item, :collateral_item, presence: true
validates :shares, numericality:
{ only_integer: true, greater_than_or_equal_to: 0,
less_than_or_equal_to: :max_shares }
accepts_nested_attributes_for :wanted_item, :collateral_item, allow_destroy: true
def max_shares
if wanted_item.shares > collateral_item.shares
collateral_item.shares
else
wanted_item.shares
end
end
end
class TradesController < ApplicationController
def create
@trade = current_user.requested_trades.build(trade_params)
end
private
def trade_params
params.require(:trade).permit(:trade_requester_id, :trade_recipient_id, :wanted_item_id, :collateral_item_id, :shares)
end
end
但我收到了NoMethodError: undefined method 'shares' for nil:NilClass 和 bd 回滚。
重现错误的步骤:
t = Trade.new
t.trade_requester_id = User.find(1)
t.trade_recipient_id = User.find(2)
t.wanted_item_id = Item.second
t.collateral_item_id = Item.first
t.shares = 100
t.save
堆栈跟踪表明它来自Trade 中的numericality 验证,但在我看来,类shares 正在被调用应该存在。我应该可以打电话给t.wanted_item 并得到那个项目,但我得到的是nil。但是,t.wanted_item_id 返回该 ID。这是为什么呢?
【问题讨论】:
-
提供将错误重复为代码而不是描述的步骤。
-
@max
t = Trade.new,t.trade_requester_id = 1,t.trade_recipient_id = 2,t.wanted_item_id = 2,t.collateral_item_id = 1,t.shares = 100,然后是t.save,这实际上引发了无方法错误 -
将其添加到问题的正文中 - 不是评论。
-
只是为了删除另一个变量,尝试注释掉
accepts_nested_attributes_for。 -
您可以尝试在
max_shares中的collatral_item和wanted_item前面添加self.。它不应该有所作为,但值得一试。我在这里抓住了稻草。
标签: ruby-on-rails ruby