friendly_idRails 4アプリケーションでslug. 現在、私はactive_admin gemを使用しています。
問題:
リソースのアクティブな管理者からリンクの表示をクリックするとGroup、次の例外がスローされます。
ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
私は、active_adminデフォルトの関数のいくつかをオーバーライドする必要があると思いますか?
friendly_idRails 4アプリケーションでslug. 現在、私はactive_admin gemを使用しています。
問題:
リソースのアクティブな管理者からリンクの表示をクリックするとGroup、次の例外がスローされます。
ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
私は、active_adminデフォルトの関数のいくつかをオーバーライドする必要があると思いますか?
アプリケーションがいくつかのリソースを終了した場合、アプリケーションを DRY に保つために、アプリケーション全体に数行のコードを必要とする優れたソリューションがあります。単純に、activeadmin のリソース コントローラーをオーバーライドします。
config/initializers/active_admin_monkey_patching.rb次の内容でファイルを作成します。
ActiveAdmin::ResourceController.class_eval do
def find_resource
finder = resource_class.is_a?(FriendlyId) ? :slug : :id
scoped_collection.find_by(finder => params[:id])
end
end
サーバーを再起動することを忘れないでください。
@AndreyDeineko のより良いアプローチは、ActiveAdmin::ResourceControllerのfind_resourceメソッドをオーバーライドconfig/initialisers/active_admin.rbし、FriendlyId (この時点では 5.x) によって提供されるメソッドを活用することです。
でconfig/initialisers/active_admin.rb:
ActiveAdmin.setup do |config|
# == Friendly Id addon
ActiveAdmin::ResourceController.class_eval do
def find_resource
if resource_class.is_a?(FriendlyId)
scoped_collection.friendly.find(params[:id])
else
scoped_collection.find(params[:id])
end
end
end
# initial config
end
これは、Active Admin の構成に関連しているため、アプリケーション コントローラーに配置するよりもはるかにクリーンに見えます。
問題の解決策が見つかりました:
あなたのapp/admin/[ResourceName.rb]追加で:
# app/admin/group.rb
# find record with slug(friendly_id)
controller do
def find_resource
begin
scoped_collection.where(slug: params[:id]).first!
rescue ActiveRecord::RecordNotFound
scoped_collection.find(params[:id])
end
end
end
これで私の問題は解決しました。