最近升级到Rails 4后,使用类似以下代码更新属性不起作用,我得到一个ActiveModel::ForbiddenAttributes错误:

@user.update_attributes(params[:user], :as => :admin)

其中,用户在模型中具有以下属性行:

attr_accessible :role_ids, :as =>admin
# or any attribute other than :role_ids contained within :user

如何在Rails 4中完成相同的任务?

推荐答案

Rails 4现在默认具有strong_parameters gem内置的功能.

人们不再需要拨打:as => :admin个电话,也不需要在模型中使用attr_accessible :user_attribute, :as => admin.原因是,默认情况下,rails应用程序现在对模型上的每个属性都具有"安全性".必须指定要访问/修改的属性.

你现在需要做的就是在update_attributes时拨打permit:

@user.update_attributes(params[:user], permit[:user_attribute])

或者更准确地说:

@user.update_attributes(params[:user].permit(:role_ids))

但是,这一行允许任何用户修改permitted角色.您必须记住,仅允许管理员或任何其他所需角色通过其他筛选器访问此操作,例如:

authorize! :update, @user, :message => 'Not authorized as an administrator.'

. . . 如果您使用Desive和CanCan进行身份验证和授权,这将起作用.

Ruby-on-rails相关问答推荐

Rails 7.1中的覆盖脚手架控制器

DELETE_IF和REJECT的意外行为!方法

无法安装Ruby错误运行';__rvm_make-J4';,

在Ruby on rails中,重复访问ActiveRecordModel返回相同的对象:预期行为还是错误?

查询Where Date.parse Rails

删除 aws s3 (rails7) 上的日志(log)文件

Ruby on Rails form_with 不显示错误,卡在服务器端

Heroku 应用程序上的远程 mysql 数据库

Rails - 如何使用子对象的嵌套属性和强参数填充父对象ID?

如何使用默认的 Rails 记录器记录 Ruby 异常的整个回溯?

注册表单上是否需要 CSRF 保护?

禁用 RVM 或使用没有 RVM 安装的 Ruby?

Rails 3.1 插件 gem、虚拟测试应用程序、rspec

rails回形针和乘客`'识别'命令无法识别`

在 Rails 应用程序中处理大文件上传的最佳方法是什么?

是否可以设置 travis 来运行多种语言的测试?

错误:无法构建 gem 原生扩展 - 安装 mysql2 时出错

您将如何解析 Ruby 中的 url 以获取主域?

Rails:弃用警告:您没有设置 config.secret_key_base

Rails.cache 在测试之间被清除了吗?