12

friendly_idRails 4アプリケーションでslug. 現在、私はactive_admin gemを使用しています。

問題:

リソースのアクティブな管理者からリンクの表示をクリックするとGroup、次の例外がスローされます。

ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1

私は、active_adminデフォルトの関数のいくつかをオーバーライドする必要があると思いますか?

4

4 に答える 4

28

アプリケーションがいくつかのリソースを終了した場合、アプリケーションを 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

サーバーを再起動することを忘れないでください。

于 2014-11-20T07:27:22.343 に答える
19

@AndreyDeineko のより良いアプローチは、ActiveAdmin::ResourceControllerfind_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 の構成に関連しているため、アプリケーション コントローラーに配置するよりもはるかにクリーンに見えます。

于 2015-11-20T11:49:42.520 に答える
6

問題の解決策が見つかりました:

あなたの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

これで私の問題は解決しました。

于 2014-11-20T07:02:26.437 に答える