friendly_id
Rails 4アプリケーションでslug
. 現在、私はactive_admin gemを使用しています。
問題:
リソースのアクティブな管理者からリンクの表示をクリックするとGroup
、次の例外がスローされます。
ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
私は、active_admin
デフォルトの関数のいくつかをオーバーライドする必要があると思いますか?
friendly_id
Rails 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
これで私の問題は解決しました。