我正试图摆脱处理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
答案 0 :(得分:1)
许可证应如下所示:
params.require(:recipe).permit fruits: [:id, :_type, ...]
属性&#34; _type&#34;必须存在所有水果,否则你只允许来自基础模型(水果)的属性