【问题标题】:strong parameters not accepting array强参数不接受数组
【发布时间】:2013-07-26 10:45:51
【问题描述】:

我认为这是一个多选复选框

型号

class User < ActiveRecord::Base
  has_many :user_roles, :dependent => :destroy
  accepts_nested_attributes_for :user_roles, :allow_destroy => true
  has_many :roles, :through => :user_roles
end

查看

<%= check_box_tag 'user[role_ids][]', role.id, user.blank? ? nil : user.roles.include?(role) ,id: dom_id(role)%>

强参数写成

  def user
    params.require(:user).permit(:first_name,{:role_ids => []})
  end

但是在创建时它说

Processing by Admin::UsersController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"+y8iWya5KIILqS0embEUEZuClycXq0O9Q4pA+MnbM0g=", "user"=>{"first_name"=>"", "last_name"=>"", "email"=>"a@loclahost.com", "language"=>"en", "access_level_id"=>"1", "role_ids"=>["", "1", "", "5", "", "", ""], "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create user"}

Unpermitted parameters: role_ids
Unpermitted parameters: role_ids
Unpermitted parameters: role_ids
Unpermitted parameters: role_ids

任何线索为什么它不接受来自表单的 role_ids 数组?

【问题讨论】:

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


    【解决方案1】:

    查看 Rails Strong Parameters documentation regarding nested attributes

    正确的格式是:

    params.permit(:name, {:roles => []}, ...)
    

    AnkitG's solution 在 Rails 4 中为我工作,使用 Role Model gem 作为我的用户模型。我的用户控制器的 _params 实现最终看起来像:

    def user_params
      # Bug with permit for nested arrays... @see https://stackoverflow.com/a/17880288/2631472
      params.require(:user).permit(:first_name, :last_name, :middle_name).tap do |whitelisted|
        whitelisted[:roles] = params[:user][:roles]
      end
    end
    

    【讨论】:

    • 为我工作。谢谢!
    【解决方案2】:

    这应该可行

    params.require(:user).permit(:first_name, :role_ids => [])
    

    【讨论】:

    • 请粘贴您的创建方法
    • 创建了一个 GIST here 。请看一下
    • 您可以在这样做时发布错误消息吗?我在控制台中尝试过,它工作正常(使用您问题中的参数)
    • @BenjaminSinclaire 感谢您的回答.. 它对我有用:)
    • 如何将 role_ids 指定为单独的键?
    【解决方案3】:

    回答我自己,我不是直接让它工作的,但是Strong Parameters issues discussion 中的以下方法帮助我将普通参数转换为列入白名单的参数。

    def user_params
      params.require(:user).permit(:first_name).tap do |whitelisted|
        whitelisted[:role_ids] = params[:user][:role_ids]
      end
    end
    

    【讨论】:

      猜你喜欢
      • 2023-04-10
      • 2015-11-16
      • 1970-01-01
      • 2014-03-14
      • 2017-10-18
      • 2014-09-26
      • 2019-09-26
      • 1970-01-01
      • 2022-06-16
      相关资源
      最近更新 更多