【问题标题】:How to permit Array in strong parameters?如何在强参数中允许 Array?
【发布时间】:2019-05-11 02:48:14
【问题描述】:

我实际上是在向我的 Rails API 发布一个 id 数组,但该数组是作为散列接收的,其中键是数组的索引。

我已经尝试允许参数 params.permit(permission_ids: []) 并且什么都没有...

用户迁移

class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :username, null: false
      t.string :email, null: true
      t.integer :language_id, null: false
      t.integer :permission_ids, array: true, default: []
      t.string :password_digest, null: false
      t.timestamps
    end
    add_index :users, :username, unique: true
  end
end

控制器中的用户参数方法。

  def user_params
    params.require(:user).permit(:username,
                                 :email,
                                 :language_id,
                                 :password,
                                 :password_confirmation,
                                 permission_ids: [])
  end

如何接收参数

Parameters: {"user"=>{"username"=>"someusername", "email"=>"someemail@question.com", "language_id"=>"2", "permission_ids"=>{"0"=>"1", "1"=>"2", "2"=>"3", "3"=>"4", "4"=>"5", "5"=>"6", "6"=>"7", "7"=>"8", "8"=>"9", "9"=>"10", "10"=>"11", "11"=>"12"}}}

顺便说一句,我是使用 Axios 从 Vue 发帖的。

【问题讨论】:

  • 我想知道真正的问题是否应该是:如何修复它发送数组的前端?哈希中的数据实际上是什么意思,有问题的 id 是键还是值?
  • 前端正在发送一个数组,问题是 Rails 将其解析为哈希。 id 是哈希值。
  • 能否请您显示此类请求的日志条目?
  • @spickermann 抱歉回复晚了,Axios 发送的请求是表单 url 编码的。由于 permission_ids 参数发送如下:permissions_ids[0]: 1, permissions_ids[1]: 2, permissions_ids[2]: 3

标签: ruby-on-rails axios strong-parameters


【解决方案1】:

您是否也可以使用提交此数据的 html 表单更新问题。问题也可能在表单中。

当您希望表单以数组形式提交条目时,表单属性应为

user['permission_ids'][]

这样,html 表单将理解在 html 表单中对permission_ids 的输入将提交一个数组。

欲了解更多信息:https://stackoverflow.com/a/45233604/4940278

【讨论】:

  • 是的,但问题是我在 vue.js 中有一个附加到 JSON 的表单,请求中的属性发送如下:user[permissions_ids][0]: 1, user[permissions_ids][1]: 2, user[permissions_ids][2]: 3,如您所见,作为数组发送但我不明白为什么 Rails 理解如果参数是一个数组并且有一个索引,你将收到一个对象数组......
【解决方案2】:

我设法获取 id 数组的方式:

def user_params
    params[:user][:permission_ids] = (params.dig(:user, :permission_ids) || {}).values
    params.require(:user).permit(:username,
                                 :email,
                                 :language_id,
                                 :password,
                                 :password_confirmation,
                                 permission_ids: [])
  end

【讨论】:

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