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

时间:2022-11-26 21:59:39

I have JS where data are posted with Ajax and in terminal my params look like this:

我有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"}}}}

My Create action looks like this:

我的Create动作如下所示:

  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

In my terminal I can see it create name and description, but does not insert user_ids and role_ids. So far I've been trying differently with params, but no luck - can't make them to be saved. I get this error: Unpermitted parameters: :user_ids, :role_ids

在我的终端中,我可以看到它创建名称和描述,但不插入user_ids和role_ids。到目前为止,我一直在尝试使用params,但没有运气 - 不能让它们得救。我收到此错误:未允许的参数:: user_ids,:role_ids

How do I make all params to be saved, please? Thank you!

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

1 个解决方案

#1


1  

instead of

代替

{
  "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"}}
  }
}

you should send

你应该发送

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

EDIT

编辑

If you can't change the format of received params, you could do something like the following:

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

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

#1


1  

instead of

代替

{
  "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"}}
  }
}

you should send

你应该发送

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

EDIT

编辑

If you can't change the format of received params, you could do something like the following:

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

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