0

単一テーブル継承を使用するRailsアプリケーションをセットアップしましたが、子クラス用に別個のフォームを用意する必要があります。アプリケーションは、悪意のあるIPアドレスなど、セキュリティ侵害の指標のコレクションを保持します。だから私はほとんどの情報を保持するIndicatorと呼ばれるクラスを持っています。ただし、インジケーターがマルウェアハッシュの場合は、追加情報を収集する必要があります。そこで、Indicatorから継承するMalwareIndicatorという別のクラスを作成しました。それですべてがうまく機能しています。

ルートを落ち着かせて見栄えを良くしたかったので、config/routes.rbファイルにこれを入れました

resources :indicators
resources :malware, :controller => "indicators", :type => "MalwareIndicator"

それは非常にうまく機能します。単一のコントローラーを指すこれらすべてのルートがあります。しかし、コントローラーでは、複数のフォームを処理する方法がわかりません。たとえば、誰かがマルウェア/新規にアクセスした場合、Indicators#New関数が呼び出され、ユーザーがMalwareIndicatorを作成したいと考えていることがわかります。では、ユーザーを正しいフォームに送信するには、respond_toブロックはどのように見える必要がありますか?現在でも、ユーザーは新しいインジケーターフォームに移動します。

  def new
    if params[:type] == "MalwareIndicator"
        @indicator = MalwareIndicator.new
    else
        @indicator = Indicator.new
    end
    @pagename = "New Indicator(s)"

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @indicator }
    end
  end

かなり近い気がします。一方で、私はすべてが間違っているかもしれないので、誰かが私を平手打ちして「ばかげたことをやめなさい」と言いたいのなら、私もそれに感謝するでしょう。

4

2 に答える 2

1

STIは問題があるだけなので、私は通常STIを避けようとします(属性が異なる3番目のインジケーターと、フィールドが多い4番目と5番目のイメージで、ほとんどの列が使用されていない巨大なテーブルになってしまうことに気付く前に)。質問に答えるには:newクラスごとに異なるビューを作成し、次のように応答できます。

respond_to do |format|
  format.html { render action: "new_#{@indicator.class.to_s.underscore}"   }
  format.json { render json: @indicator }
end

レンダリングするnew_indicator.html.erbか、クラスnew_malware_indicator.html.erbに依存し@indicatorます。

于 2012-07-19T20:15:56.833 に答える
0

ビュー自体で処理しました。マルウェアのルートエントリにより、コントローラーはタイプパラメーターを受け取り、コントローラーはそれを使用して正しいクラスのインスタンスを作成します。new.html.erbファイルで、これを最後に置きます。

<%= render :partial => @indicator.class.to_s.downcase %>

したがって、MalwareIndicatorがコントローラーによって作成された場合、@indicator.class.to_s.downcaseはmalwareindicatorを返します。正しい形式の_malwareindicator.html.erbという部分ファイルがあります。

したがって、Indicatorクラスの別の子孫を作成する必要がある場合は、routesファイルに別のリソースエントリを追加し、_whateverindicator.html.erbという部分を作成すると、問題なく動作するはずです。

于 2012-07-20T14:36:27.310 に答える