我有一个模型Request和嵌套模型fill_cartridges。
has_many :filled_cartridges, inverse_of: :request, dependent: :destroy
accepts_nested_attributes_for :filled_cartridges, reject_if: proc { |attributes| attributes['title'].blank? },allow_destroy: true

我的强烈指责:
def request_params
params.require(:request).permit(:name,:type,
:filled_cartridges_attributes => [:client_id,:cartridge_name,:cartridge_id,
:request_id,:_destroy,:id],
end

使用此方法我相信我的嵌套模型在保存父(请求)模型时是自动保存的。 可能有很多fill_cartridges。
我想要做的是设置client_id和cartridge_id before_validation,如果我不知道他们将在非null约束中失败。我相信before_validation在每个对象验证之前调用一些方法。所以我相信before_validation会在验证所有嵌套对象之前调用我的方法。
这就是我尝试使用before_validation的方式:
before_validation :set_attributes, only: [:create]
....
protected
def set_attributes
@client = Client.where("name = ?", self.name).take # this is a problematic
@cartridge = Cartridge.where('cartridge_name=?', self[:filled_cartridges_attributes][:cartridge_name].take # this is too
self.client_id = @client.id
self.cartrdige_id = @cartridge.id
end

在set_attributes的前两行中,我想首先找到我的客户端和盒式磁带对象。为此,我想使用strong_params中的值。 我怎么能这样做?