Rails 尝试访问模型中的参数

Posted

技术标签:

【中文标题】Rails 尝试访问模型中的参数【英文标题】:Rails Trying to access parameters in Model 【发布时间】:2015-08-13 02:06:11 【问题描述】:

我通过 Devise gem 创建了一个用户模型

我的关系设置为:

用户与角色具有多对多关系 用户属于_to(一对多关系)批次 用户 has_one(与)UserProfile 的一对一关系

现在每次创建用户时,我都会调用方法 cup 来创建用户配置文件。问题是除了在模型中设计自己的参数之外,我无法访问任何东西。

例如,我有一个下拉菜单可以选择角色,但我无法访问其选定的值

我的目标是做类似的事情:

  def cup
    if role.title == 'this'
      create_user_profile(:username => 'username01')
    else
      create_user_profile(:username => 'username02')
    end
  end

这是模型的样子:

class User < ActiveRecord::Base

  has_and_belongs_to_many :roles
  belongs_to :batch
  has_one :user_profile

  after_create :cup

  def cup
    create_user_profile(:username => 'username')

  end

  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable
end

我的参数如下所示:

"utf8"=>"✓", "authenticity_token"=>"TbsLJxZB2aeDgj8RitTRKURCc3KODCKpv/xphwhAaIw=", "用户"=>"用户名"=>"rfdsfew", "role_id"=>"1", "batch_id"=>"1", "user"=>"email"=>"2@223.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]", "commit"=>"注册"

我可以访问 user 哈希中的参数,但不能访问 users 哈希

我的猜测是,这是因为设计控制器中不允许用户散列,因为我无法访问设计的控制器我不知道如何允许 users 散列。

我在网上找到了这个,但没有用:

before_filter :configure_permitted_parameters, if: :devise_controller?

protected

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) << :username
end

【问题讨论】:

为什么你有一个users哈希一个user哈希? 因为 user 哈希是由设计自己的字段生成的,collection_select 不允许我将其值添加到用户哈希中,而是我必须使用 :users 生成 @987654329 @hash... 例如:&lt;%= collection_select(:users, :role_id, Role.all, :id, :role)%&gt; 参数在模型中不可访问,即使您将它们作为参数传递,也会被视为不好的做法,也可能很危险。 【参考方案1】:

主要是额外的参数应该是params[:user]的一部分,所以把你的调用改为collection_select

接下来你需要确保设计允许那些额外的参数——这就是

 devise_parameter_sanitizer.for(:sign_up) << :username

您需要为每个额外的参数执行此操作。但是对于数组参数,您需要使用更长的形式:

devise_parameter_sanitizer.for(:sign_up) |u| u.permit(:email, :password, :username, :batch_id, :role_ids => [])

这让我想到了您需要的最后一个更改:您与角色的关联是 has_and_belongs_to_many:您不能分配 role_id,您必须分配 role_ids,它必须是一个数组。

您需要将表单元素使用的名称更改为role_ids,并且为了让rails 将其解析为数组,您需要在其末尾添加[]。如果您将:multiple =&gt; true 传递给选择助手,他们应该为您执行此操作。

【讨论】:

我不断收到此错误 undefined local variable or method devise_parameter_sanitizer' 为 #<0x007ff0788e3378>

以上是关于Rails 尝试访问模型中的参数的主要内容,如果未能解决你的问题,请参考以下文章

尝试从 Rails 中的 URL 参数显示 DIV

Rails - 从视图中的索引操作访问实例变量属性

为啥不能使用符号而不是字符串来访问 Rails 模型属性?

Rails:如何访问视图中的belongs_to字段?

Rails:如何跨视图访问模型和控制器数据?

Rails:如何在一个循环中访问两个模型