4

特定のユーザーが選択した「モード」に応じて、大幅に異なるビューがあります。

異なる動作を 2 つの異なるヘルパーに抽出し、コントローラーに次のようなコードを含めることを考えました。

class MyController < ApplicationController

case mode
when 'mode1'
  helper "mode1"
when 'mode2'
  helper "mode2"
else
  raise "Invalid mode"
end

etc...

正しいヘルパーがロードされると、両方のヘルパーで定義されている <%= edit_item %> のようなステートメントが、特定の「モード」の正しいフォームをロードします。

これは開発では見事に機能しますが、本番環境では case ステートメントは 1 回しか実行されません。次に、最初にロードされたヘルパーに固執します(当たり前!私はそれを知っているべきでした。)

必要なことを達成するための他の方法を考えましたが、このヘルパーの使用は、ビューの動作を変更するためのきれいな方法だと思います。

実行時にヘルパーをロード (またはリロード) する方法を知っている人はいますか?

TIA: ジョン

4

2 に答える 2

1

この質問をさらに掘り下げた後、これはばかげた考えだと思い始めています...マルチユーザーシステムで実行時にモジュールを置き換えることの意味は良くありません。

誰かが私の考えを変える素晴らしいアイデアを思い付かない限り、私はその日の終わりまでにこの質問を撤回します.

-- ジョン

于 2008-12-27T19:48:07.453 に答える
1

これを行う方法はいくつか考えられますが、あなたが提案したようにモジュールをロードすることについてはわかりません。

さまざまなパーシャルをロードし、状態に基づいてロードするものを選択します。

<% if @mode = 'mode1 %>
  Mode 1:
  <%= render :partial => 'mode1' %>
<% else %>
  Mode 2:
  <%= render :partial => 'mode2' %>
<% end %>

または、そのロジックをビューから除外したい場合 (これは良いことかもしれません)、コントローラーに何かを入れて、モードに基づいてさまざまなアクションをレンダリングすることができます。

def index
   @mode = params[:query]
   case @mode
     when 'mode1' then render :action => "mode1"
     when 'mode2' then render :action => "mode2"
     else raise "Invalid mode"
   end
end

そのロジックをビューに入れるよりもはるかに優れているようです。

于 2008-12-27T21:55:05.137 に答える