【问题标题】:Keeping model name as root key with StrongParameters使用 StrongParameters 将模型名称作为根键
【发布时间】:2018-01-25 02:56:27
【问题描述】:

StrongParameters 有没有办法将模型名称保留为哈希根?

例如,当我提交创建用户的表单时,我的参数看起来像

<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"...", "user"=>{"full_name"=>"first last", "email"=>"me@example.com"}, "button"=>"", "controller"=>"admin/users", "action"=>"create"} permitted: false>

注意它们包含"user"=&gt;{...}。 然而,在用 StrongParamyetes 对它们进行消毒之后

  def user_params
    params.require(:user).permit(:full_name, :email)
  end

我明白了

<ActionController::Parameters {"full_name"=>"first last", "email"=>"me@example.com"} permitted: true>

在根键中没有"user"

我知道,我可以手动添加它

  def user_params
    { user: { params.require(:user).permit(:full_name, :email) } }
  end

但我想知道是否可以设置一个选项以在我的所有控制器上默认获取该行为。

谢谢。

UPDATE 1(使用user_params

#users_controller.rb
def create
 if MyFancyFancyObject.call(user_params)
    redirect_to users_path, 
  else
    render action: "new"
   end
end

【问题讨论】:

  • 您这样做有什么具体原因吗?
  • 是的,确实是有原因的。在不关注与问题无关的太多细节的情况下,我可以说将模型名称作为键允许我从下层提取重复的代码。目前,我有多个执行相同操作但它们不同的对象,因为除了参数之外,它们还必须知道要使用的类。使用参数中的名称,我可以拥有一个对象。谢谢
  • 您在控制器中使用 StrongParamyetes 对哪里进行消毒?我没有得到你真正想要的问题。
  • @Vishal 我已经添加了我的create 操作。仅供参考,当 IMyFancyFacyObject.call 返回 truefalse 时。希望这可以为您提供全貌。
  • @macsig MyFancyFancyObject 是模型还是服务?

标签: ruby-on-rails strong-parameters


【解决方案1】:

我想知道是否可以设置一个选项以在我的所有控制器上默认获取该行为。

不,没有。您要做的根本不是 StrongParameters 的工作原理。只要您params.require(:user),您就会返回与该键关联的嵌套值集。

您唯一的选择是按照您的建议手动构建新哈希:

def user_params
  { user: { params.require(:user).permit(:full_name, :email) } }
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多