Я не совсем уверен, что это то, что вам нужно, хотя работа с приведенным кодом позволит избежать NoMethodError
с которыми вы столкнетесь.Если родитель существует, вы сможете получить к нему доступ даже при использовании build
/ create
.EG
c = parent.build_child
c.parent # => #<Parent id: ...>
Следовательно, как насчет одного из следующих:
# ref https://api.rubyonrails.org/classes/Object.html#method-i-try
if @attachment.instance.parent.try(:parent_attribute)
...
end
# ref https://docs.ruby-lang.org/en/2.6.0/syntax/calling_methods_rdoc.html#label-Safe+navigation+operator
if @attachment.instance.parent&.parent_attribute
...
end
# both use safe navigation operators and are essentially short hand for:
# @attachment.instance.parent && @attachment.instance.parent.parent_attribute
Они вернут nil
, если нет родителя, и поэтому будут ложными, чтобы перейти к Paperclip::TempfileFactory.new.generate
.
Вы также можете использовать delegate
:
# child.rb
delegate :parent_attribute, to: :parent, allow_nil: true
Это позволит вам безопасно звонить:
if @attachment.instance.parent_attribute
# ...
end
NBВы также можете предоставить префикс для делегирования, если он помогает уточнить вещи при вызове метода на @attachment.instance
.
Надеюсь, что это поможет - дайте мне знать, как у вас обстоят дела или если у вас есть какие-либо вопросы.