activeadmin nested belongs_to route error

問題

在activeadmin裡因為routes被自動加上shallow的關係使breadcrumb連結錯誤,如果你有遇到相同的問題的話或許你可以參考看看這篇。

models
ActiveAdmin.register Product do
end
ActiveAdmin.register Variant do
    belongs_to :product
end
ActiveAdmin.register Photo do
    belongs_to :variant
end

如上面的code,在activeadmin裡如果有model用belongs關聯到第三層的話,他會自動使用shallow簡化routes,在前兩層的routes如下面一樣是正常的

#product 第一層
admin_products_path
ew_admin_product
edit_admin_product
admin_product
#variant 第二層
admin_product_variants
new_admin_product_variant
edit_admin_product_variant
admin_product_variant

但是activeadmin到了第三層的photo就會在上一層的variant使用shallow簡化routes,讓routes省了product那一層變成下面這樣

admin_variant_photos
new_admin_variant_photo
edit_admin_variant_photo
admin_variant_photo

當然這樣在使用上沒什麼問題,只要跟著routes基本上都連得到,但是問題來了在activeadmin裡會自動產生breadcrumb(麵包屑),當某一層的resource被加上shallow之後,breadcrumb的url也會跟著改變,在breadcrumb上看起來像是一樣但事實上連結的url已經不一樣了,下面舉個例子

1.`ADMIN / PRODUCTS / product_id / VARIANTS /`

2./ADMIN / VARIANTS / VARIANT #45 / PHOTOS /

1的麵包屑的VARIANTS的url會是admin/products/1/variants
2的麵包屑的VARIANTS的url會是admin/variants
所以實際上去點2的VARIANTS會出現Couldn't find Product with 'id'=的error,因為不知道product id所以不知從何找起。

解法

在被加上shallow的那一層model的belongs_to加上optional: true的屬性

admin/Variant.rb
ActiveAdmin.register Variant do
belongs_to :product, optional: true
end

這樣就會使Variant的routes自己獨立出來,像是下面這樣

namespace :admin do
  resources :product do
    resources :variants , shallow:true do
      resources :photos
    end
  end
  
  #獨立routes出來
  resources :variants do
    resources :photos
  end
end

所以也不需要product id就可以從variants開始找
我遇到的這個問題真的有點難用文字敘述出來,下面是在activeadmin issues有人遇到相同的問題,跟解法有興趣的人或是看不太懂我上面說明的人可以看看
問題:Nested belongs_to is broken
解法:Added nested belongs_to functionality.

comments powered by Disqus