Rails 5.1:JSON POST请求的强大参数

时间:2017-06-27 16:53:09

标签: ruby-on-rails json

我有JS用Ajax发布数据,在终端我的params看起来像这样:

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。到目前为止,我一直在尝试使用params,但没有运气 - 不能让它们得救。 我收到此错误:Unpermitted parameters: :user_ids, :role_ids

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

1 个答案:

答案 0 :(得分: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