J'ai ces modèles et les codes de commande:NoMethodError: méthode non définie '' pour rien: NilClass
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
Mais je deviens NoMethodError: undefined method 'shares' for nil:NilClass
et un rollback de bd. Étapes pour reproduire l'erreur:
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
La trace de la pile indique qu'il vient de la, il me semble validation Trade
numericality
, mais que la classe shares
est appelée sur devrait exister. Je devrais être en mesure d'appeler t.wanted_item
et obtenir cet article, mais à la place, je reçois nil
. t.wanted_item_id
, cependant, renvoie cet identifiant. Pourquoi est-ce?
indiquent les étapes à répéter l'erreur code au lieu d'une description. – max
@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' , puis 't.save' qui est ce qui déclenche réellement l'erreur de la méthode no – sabaeus
Ajoutez-le au corps de la question - pas un commentaire. – max