0

我已经设置了一个使用单表继承的 Rails 应用程序,但我需要为我的子类设置一个不同的表单。该应用程序保留了一系列安全威胁指标,例如恶意 IP 地址。所以我有一个名为 Indicator 的类,它包含大部分信息。但是,如果指标是恶意软件哈希,我需要收集更多信息。所以我创建了另一个名为 MalwareIndicator 的类,它继承自 Indicator。一切都很好。

我希望我的路线安静且看起来不错,所以我在 config/routes.rb 文件中有这个

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

这很好用。我有所有这些路由都指向我的单个控制器。但是在控制器中我不确定如何处理多种形式。例如,如果有人去恶意软件/新的指标#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

I usually try to avoid STI because there are only troubles with that (image third indcator with different attributes and fourth and fifth with more fields and before you realize you end up with huge table where most columns are unused). To answer your question: you can create different new views for different classes and respond like that:

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

that should render new_indicator.html.erb or new_malware_indicator.html.erb depends on @indicator class.

于 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 的部分文件,其中包含正确的格式。

因此,如果我必须创建指标类的另一个后代,我可以将另一个资源条目添加到路由文件并创建一个名为 _whateverindicator.html.erb 的部分,它应该可以正常工作。

于 2012-07-20T14:36:27.310 回答