在单个表继承上接受嵌套属性

时间:2015-03-01 10:51:18

标签: ruby-on-rails strong-parameters single-table-inheritance

我正试图摆脱处理STI模型的控制器中重复的强制参数。例如,我有模特:

class Recipe < ActiveRecord::Base
  has many :fruits
  accepts_nested_attributes_for :fruits, allow_destroy :true
end

class Fruit < ActiveRecord::Base
  belongs_to :recipe
end

class Apple < Fruit
end

class Orange < Fruit
end

class RecipesController < Admin::BaseController
  ...
  def update
   @recipe.update_attributes recipe_params
  end
  ...
  def recipe_params
    params.require(:recipe).permit( :some_recipe_params
                                    ...
                                    ??? )
  end
end

有没有方便的方法来允许'apple_attributes'和'orange_attributes'而不在许可选项中重复它们?在未来的应用将有更多的水果类型。或者也许水果模型应该在另一个控制器中处理。

我发现用白名单做一个丑陋的方式:

params.require(:recipe).permit( ... ).tap do |whitelisted|
  Recipe.fruit_types.each do |type|
    whitelisted[:"#{type.pluralize}_attributes"] = params[:recipe][:"#{type.pluralize}_attributes"] || {}
  end
end

1 个答案:

答案 0 :(得分:1)

许可证应如下所示:

params.require(:recipe).permit fruits: [:id, :_type, ...]

属性&#34; _type&#34;必须存在所有水果,否则你只允许来自基础模型(水果)的属性