Rails / 两个控制器共享强参数定义

Rails / Shared strong parameters' definition between two controllers

有两个 items_controller,一个用于 api(在 app/controllers/api/ 中),一个用于后端(在 app/controllers/backend 中)

strong参数比较长(20个字段左右),提示进化了一点。在两个控制器中维护此列表并非不可能,但由于 create/updates 操作的需求或多或少相同,我会考虑在一个单独的文件中共享强参数定义分享给双方

我试图用一个仅包含强参数定义的超级控制器继承这两个:

class SharedItemsController < ApplicationController
  private # not knowing all the prerequisites of this, I tried also using protected instead of private; same result 
    def item_params
       ....
    end
  end
end
class  Frontend::ItemsController < SharedItemsController
   ...
end
class  Api::ItemsController < SharedItemsController
   ...
end

没有成功,我遇到了不允许的参数

希望在 SO 上得到一些关于这方面的提示; 最佳

我真的不明白你为什么不放

private

def item_params
    params.require(:item).permit(your_fields_name)
end

特别是控制器?

如果您认为您有 20-30 个字段并且在其中添加所有字段会让您感到困惑,如果将来我需要使用嵌套属性怎么办,那么它会更加复杂。这么短手

private

def item_params
    params.require(:item).permit!
end

允许!就是这样,您不再需要在 params 中定义每一列,即使它是嵌套的。 祝你好运。

感谢@SergioTulentsev;在这种情况下,一个基本且更可取的模式是使用模块。例如在 lib/items_controller_params.rb 中:

module ItemsControllerParams
  def item_params
    params.require(:item).permit(
       .. your fields here ...
    )
  end
end

然后它可以包含在相关控制器中,如下所示:

  class Api::ItemsController < ApplicationController
    include ItemsControllerParams
    ...
  end