0

Rails アプリケーションを作成しています。ビューに渡されたモデル オブジェクトを使用して、このオブジェクトに対する何らかのアクションの URL を取得できるようにしたいと考えています。たとえば、次のようになります。

link_to object.public_send(attribute),
        { :controller => object.controller_path,
          :action     => :show,
          :id         => object.id }

これを行うにはどうすればよいでしょうか。Draperのようなデコレータで実行できますか? オンラインでいくつかの例はありますか?


アップデート。 私はこれについて考え、デコレーターはコントローラー情報を保持するのに適した場所ではないと判断しました。デコレーターの責任ではありません。デコレーターは、フォーマットされたデータをマークアップでレンダリングすることだけを知っている必要があります。Accessor今のところ、モデルとコントローラーおよびルーティング認識を混在させようとするモジュールを作成しました。何か良い方法はないかと今でも思います。

4

2 に答える 2

0

Avdi Grimm によるObjects on Railsで非常に興味深いソリューションを見つけました: Exhibits for REST。要するに、彼のアイデアは、複数の RubySimpleDelegatorをさまざまな機能を持つデコレータとして適用することです。

于 2012-10-27T17:50:33.030 に答える
0

ビューに別のインスタンス変数を使用してもかまわない場合は、非常に単純なクラスを使用してこれを実装できます (デコレータは必要ありません)。

class MyRouter
  def initialize(controller, object)
    @controller = controller
    @object     = object
  end

  def url_for(action_name)
    controller.url_for(object, :action => action_name)
  end
end

コントローラーで:

class AController
  def edit
    @router = MyRouter.new(self, object)
    render 'shared_view'
  end
end

class BController
  def edit
    @router = MyRouter.new(self, object)
    render 'shared_view'
  end
end

そしてあなたの共有ビューで:

<%= @router.url_for(:show) # Varies with the controller that rendered the view %>

もちろん、これは、ターゲットとして必要なコントローラーが、ビューをレンダリングするコントローラーと同じであることを前提としていますが、これは正しくない可能性があります。それでも、このパターンを使用すると、ビューを変更することなく、ニーズに合ったより複雑なロジック (複数のRouterクラスを持つなど) に対応できます。

于 2012-10-03T21:26:24.897 に答える