1

destroy特定のリソースに対してアクションが定義されています。完了すると、視覚効果のあるrjsファイルを使用して、呼び出し元のページからリソースを削除します。

私の問題は、destroyアクションが2つの異なるテンプレートから呼び出される可能性があることです。したがって、どのテンプレートから呼び出されているかによって、視覚効果を変える必要があります...そうする方法はありますか...?

1:これを行う方法の1つは、destroyアクションとdestroy-variantアクションを作成し、一方のテンプレートでdestroy-variantアクションを呼び出し、もう一方のテンプレートで通常のテンプレートを呼び出すことだと思います...しかし、それは間違いです。 DRYのアイデア。そして正直なところ、私もそうする方法が完全にはわかりません... :method => :delete, :action => :destroy-variantURLオプションでの使用は機能しますか?

2:私には可能性のように思われるもう1つの方法は、どのページがアクションを呼び出しているかを調べ、必要に応じてさまざまなrjsファイルをプッシュすることです。しかし、どのページがアクション呼び出しを行っているかを区別する方法がまったくわかりません。

3:最後の方法は、テンプレート/ RJSをやり直して、両方のテンプレートに同じ視覚効果を適用できるようにすることです。

アドバイスをいただければ幸いです。:)

4

1 に答える 1

2

使用しているjavascriptライブラリについては言及していません。このソリューションはjqueryベースです。たった1つのアクションでやりたいことがとても簡単にできますdestroy。しかし、私はそれについて行くために別のテクニックを提案するでしょう。rjsはかなり制約があります。jqueryタコナイトプラグインを探してください。そのすべてのマークアップではなく...目にはあまり魅力的ではないerbと混合されたJavaScriptの束!

だから今あなたの代わりにあなたdestroy.rjsは持っているでしょうdestroy.xml.erb。あなたがそれに入れる必要があるものに入る前に、あなたがあなたのdestroy行動のためにどんな修正をする必要があるか見てみましょう。

前:

   def destroy
        @model = Model.find(params[:id])
        @model.destroy

          respond_to do |format|
            format.html { redirect_to :action => :index }
            format.xml
          end
    end

後:

   def destroy
        @model = Model.find(params[:id])
        @model.destroy
        @template = params[:template]
          respond_to do |format|
            format.html { redirect_to :action => :index }
            format.xml
          end
    end

単純化するために、routes.rbに名前付きルートを追加します。

map.destroy_using_template 'destroy/:id/:template', :controller => "controller", :action => "destroy"

あなたの見解では:

jquerytaconiteプラグインをのヘッダーに追加します<layout>.html.erb

<%= javascript_include_tag "jquery.js", "jquery.taconite.js" %>

テンプレート1のビュー:

リンクを使用して削除するとします。

   <%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp1"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>

テンプレート2についても同じです。

リンクを使用して削除するとします。

   <%= link_to "Delete", destroy_using_template_path(:id => "1", :template => "temp2"), :method => :delete, :confirm => "Are you sure you want to delete the record?" %>

今あなたのdestroy.xml.erb

<taconite>
    <% if @template=="temp1" %>
      <remove select="#template1" />
    <% elsif @template=="temp2" %>
      <remove select="#template2" />
    <% end %>

    <eval>
        //OPTIONAL: Execute some javascript here if you want. You can do most of the DOM modifications using taconite itself.
        alert("HEY!!!");
    </eval>
</taconite>

今は簡単じゃないですか?:)

タコナイトを使用するときは、destroy.xml.erbのコードがXMLに準拠していることを確認する必要があることを忘れないでください。開いているタグは必ず閉じてください。タコナイトの詳細については、http://malsup.com/jquery/taconite/をご覧ください。

Taconiteは、すべての通常のjquery DOM修飾子をマークアップに実装し、いくつかの独自の修飾子を追加します。javascriptに切り替えたい場合は、eval上記のようにタグにそのjavascriptを含めるだけで簡単に切り替えることができます。

于 2010-07-04T15:02:01.807 に答える