0

レコードをソフト削除すると、コントローラーのアクションでそれを呼び出すことができません。これはshow、レコードの に一致するレコードを探すためですID WHERE deleted_at IS NULLL。これは宝石の目的を考えると正しいですが、それでもできるようにしたいと思いますアプリケーション内で一種の「読み取り専用」状態でアクセスして、ユーザーがアーカイブを確認し、場合によっては復元できるようにします。

オブジェクトに再度アクセスできるように、削除スコープを回避するにはどうすればよいですか?

更新 1

@slowjack2k のアドバイスにより、次のクエリを使用してソフト削除されたレコードにアクセスできます。

 @area = Area.only_deleted.find(params[:id])

その後、 CanCanCan が 原因で新しい問題が発生しましたload_and_authorize_resource

 @area = Area.find(params[:id])

only_deletedフィルターを無視すると、選択した ID は deleted_at が null ではない (削除されていない) 場合にのみ見つかるため、エラーが発生し、承認を無効にすると「修正」されるため、CanCanCanParanoiaの間の問題である必要があります。

これはまったく同じ問題のスレッドです: https://github.com/rubysherpas/paranoia/issues/356

これが StackOverflow の新しい問題のスレッドです: Paranoia と CanCanCan の間の Rails 5 の互換性、危うい?

解決策が見つかったら、もう一度更新します。ありがとうございます。

更新 2

問題は解決されました。解決策は、上記の新しい問題のスレッドで見つけることができます。

4

2 に答える 2

4

YourModel.readonly.find_with_deleted(params[:id])または使用できますYourModel.readonly.with_deleted.find(params[:id])

于 2016-10-05T21:19:25.387 に答える
1

私はこれを以前に投げてきました。これを解決するための私のアプローチを説明します..

概要: Items というモデルがあるとすると、 inactiveSoft Deletedと呼ぶすべてのアイテムを表示するページがあります。indexアクションの同じテンプレートを使用する

まず、ルートを作成する必要があります

  resources :items

    collection do
      get 'inactive'
    end

  end

次に、コントローラーアクションを作成する必要があります...

  def inactive
    @Items = Items.only_deleted
    render action: :index
  end

3番目に、../items/inactiveアクティブまたはアーカイブされたアイテムが表示されます

その後、使用することもできます...

<%= link_to "Archived Items", inactive_items_path %>

ビューでそのページに移動します

アップデート

ここで、ビューを使用してItemsindexコレクションをレンダリングすると、リンクが壊れたままになる可能性があることに注意してください。inactive

ビュー/アイテム/index.html.erb

<td><%= link_to 'Show', merchant %></td>
<td><%= link_to 'Edit', edit_merchant_path(merchant) %></td>
<td><%= link_to 'Destroy', merchant, method: :delete, data: { confirm: 'Are you sure?' } %></td>

通常のアイテムの編集リンクをグループ化して部分的に配置し、非アクティブなリンクをグループ化して別の部分的に配置することを選択するかどうかは、あなたに選択の余地があります。ビューをレンダリングします。

または、オプション 2は、行をなくして、リンクをrender action: :index含む別のビューinactive.html.erbを作成し、頭痛の種から解放することです。DRYの原則に反しますが。

于 2016-10-05T14:43:52.960 に答える