【问题标题】:Rails 5.1.: strong params for JSON POST requestRails 5.1.:JSON POST 请求的强参数
【发布时间】:2017-06-28 02:12:41
【问题描述】:

我有使用 Ajax 发布数据的 JS,在终端中我的参数如下所示:

Started POST "/strongbolt/user_groups" for 10.0.2.2 at 2017-06-27 16:27:23 +0000
Processing by Strongbolt::UserGroupsController#create as JSON
  Parameters: {"strongbolt_user_group"=>{"name"=>"Some test group",
 "description"=>"Some test description", "user_ids"=>{"0"=>{"id"=>"3"},
 "1"=>{"id"=>"2"}, "2"=>{"id"=>"5"}}, "role_ids"=>{"0"=>{"id"=>"1"},
 "1"=>{"id"=>"2"}}}}

我的创建操作如下所示:

  def create
    user_roles #Helper method
    @user_group = Strongbolt::UserGroup.create!(user_group_params)
    respond_to do |format|
        format.js { flash.now[:notice] = "User group #{@user_group.name} created!" }
        format.json { render json: {
          data: @user_group.as_json(only: [:id, :name, :description], include: {
            users: { only: [:id, :name] }, roles: {only: [:id, :name] }}),
          }
        }
    end
  end

  private

  def user_group_params
    params.require(:strongbolt_user_group)
          .permit(:name, :description, {user_ids: []}, {role_ids: []})
  end

在我的终端中,我可以看到它创建了namedescription,但没有插入user_idsrole_ids。到目前为止,我一直在尝试不同的参数,但没有运气 - 不能让它们被保存。 我收到此错误:Unpermitted parameters: :user_ids, :role_ids

请问如何保存所有参数?谢谢!

【问题讨论】:

  • 你试过不用花括号包裹 user_ids 和 role_ids 吗?我没有测试过,但我几乎可以肯定这是原因
  • @Aleksandrus 谢谢,但这不起作用,因为它仍然显示Unpermitted parameters: :user_ids, :role_ids

标签: ruby-on-rails json


【解决方案1】:

而不是

{
  "strongbolt_user_group"=>{
    "name"=>"Some test group",
    "description"=>"Some test description",
    "user_ids"=>{"0"=>{"id"=>"3"}, "1"=>{"id"=>"2"}, "2"=>{"id"=>"5"}}, 
    "role_ids"=>{"0"=>{"id"=>"1"}, "1"=>{"id"=>"2"}}
  }
}

你应该发送

{
  "strongbolt_user_group"=>{
    "name"=>"Some test group",
    "description"=>"Some test description",
    "user_ids"=>["3", "2", "5"], 
    "role_ids"=>["1", "2"]
  }
}

编辑

如果您无法更改接收参数的格式,您可以执行以下操作:

private

def user_group_params
  modified_params.require(:strongbolt_user_group)
        .permit(:name, :description, {user_ids: []}, {role_ids: []})
end

def modified_params
  user_ids = params[:strongbolt_user_group][:user_ids].values.map(&:values).flatten
  role_ids = params[:strongbolt_user_group][:role_ids].values.map(&:values).flatten
  ActionController::Parameters.new({
    strongbolt_user_group: params[:strongbolt_user_group].except(:user_ids, role_ids).merge(user_ids: user_ids, role_ids: role_ids)
  })
end

【讨论】:

  • 谢谢,我知道我应该这样发送。只是我的 JS 发送了上面提到的参数......不确定我是否可以改变它。我可以在 Rails 方面做些什么吗?
  • 理想情况下,您应该以正确的格式发送它,但您可以修改参数,即 params["strongbolt_user_group"]["user_ids"].map {|k, v| v.values}.flatten 将返回 ["3", "2", "5"]
  • 在我的代码中应该放在哪里?我试过before_action,但得到了NoMethodError (undefined method map for #<ActionController::Parameters:0x007f1bc9f93df0>
  • 谢谢,但是它给了我与undefined method map相同的错误
  • hmm Method map is deprecated and will be removed in Rails 5.1...我已经更新了我的答案
猜你喜欢
  • 2014-04-28
  • 2017-12-26
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多