Все зависит от задачи. Стандартом является мой первый ответ, потому что приложение не должно выводить ссылки на несуществующие объекты, а значит и переходов по ним быть не может. Если кто-то намеренно пытается подставлять несуществующий id или администратор удалил запись (т.е. довольно редкий случай) - простой редирект на главную является достаточно нормальным поведением, либо отображение 404 страницы. Т.е. переход по такой ссылки не является вашим юзкейсом и Вам всего линь нужно обработать исключительную ситуацию, то используем перехват исключений
Если есть именно задача, проверять есть ли запись и отправлять на корень - тогда мы пишем явный код, используя специально созданный для этого механизм - фильтры в контроллерах.
Т.е. обобщая - если переход по ссылке исключительтая ситуация, то искпользуем find который выбросит исключение. Если нормальная - используем find_by_id и проверяем результат.
User.transaction do
@user.positions.where(company: @company).delete_all
user_positions_params.each do |position|
@user.positions.create(company: @company, name: position[:name])
end
end
Если рассматривать Ваш пример - company_id - не самый лучшай вариант для идентефикации компании. Компания наверняка как-то связана с текущим залогиненым пользователем и искать ее нужно от него.
def user_positions_params
params.require(:user).permit(position_attributes: [::name])
end
Врятли мой код будет работать, но мысль верная. Надо разобраться со strong params, удалить все текущеи связи с компанией и создать новые