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
有两个 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