0

さて、DRY!そのため、すべてのコントローラー (私の場合はコピー) に新しいアクション (既存の new、edit など) を簡単に追加できるはずだと考えました。しかし、すべてのコントローラーに新しいルートを設定するにはどうすればよいでしょうか?

routes.rb 内の「ループ」(つまり %w().each ...) に入らずに?

つまり、DRYが必要ですよね?そのため、各リソースのルート ファイル内にアクションをコピーしたくありません。デフォルトのアクション/ルート(インデックス、新規、編集など)を簡単に拡張できるはずだと思いますか?

ありがとう!

4

2 に答える 2

0

デフォルトではこれを行う方法はありません。リソースにモンキー パッチを適用して、この機能を含めることができます。

https://github.com/rails/rails/blob/b229bc70e50ec0887c5bb3aaaa9c6ee8af054026/actionpack/lib/action_dispatch/routing/mapper.rb#L982

...しかし、あなたがやりたいことは「レールから外れた」ので、この機能を別の方法で作成できるかどうかを再検討したほうがよいと思います。

1 つのオプションは、モデルと ID を受け入れてクローンを作成する CloneController#new を作成することです。これはより乾燥しているように思われ、膨大な数の「clone_article」、「clone_blog」、「clone_user」パスをあちこちに配置する必要はありません。

明らかに、渡すことができるモデル/ID を慎重にホワイトリストに登録する必要があります。

于 2012-04-19T14:58:24.417 に答える
0

ソースを調べても、リソースのデフォルト アクションに追加する方法はありません。

しかし、@juwiley が言うように、メソッドはメソッドのロードをresources :item作成するための単なるショートカットです。membercollection

あなたがする必要があるのは、このようなものです

class ActionDispatch::Routing::Mapper

  def resources_with_copy(*resources, &block)

    block_with_copy = lambda do
      block.call

      member do
        post :copy
      end
    end

    resources(*resources, &block_with_copy)
  end
end

次に、routes.rbで次のように言います

resources_with_copy :items
resources_with_copy :posts do
  member do
    post :share
  end
end
...
于 2012-04-19T18:21:12.623 に答える