新手问题 升级到 Ruby On Rails 4.0 时的问题

hellomac · 2013年08月09日 · 最后由 hellomac 回复于 2013年08月09日 · 3216 次阅读

Hi,我又遇到问题了. 有一个小项目原来是 3.2 版本,想升级到 4.0,不过新特性完全没搞明白,卡住了,请大家指点一二。

strong_parameters

  • Gemfile 中指定 rails 4.0 版本并且bundle过了
  • 注释 config.active_record.whitelist_attributes
  • 删除 model 中的 attr_accessible
  • 新建/config/initializers/strong_parameters.rb 文件,增加ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection) 重启 pow,@server.update(:skip_check =>true)仍然可以正常更新。😡 童话世界里不应该是不能更新,然后我修改代码 @server.update(:skip_check =>true) private def skip_params params.require(:skip_check) end 吗??? 果然童话里都是骗人的...

亲是这样玩的 @hellomac

@server.update_attributes(params.require(:server).permit(:skip_check...))

@suxu 以后可以插入代码哦,建议使用代码插入 (右上角插入图片按钮旁边),要不然@server要怒了。

@server.update_attributes(params.require(:server).permit(:skip_check...))

#1 楼 @suxu 我还是不明白一点,以前 attr_accessible 的方式,如果忘记了会直接报错,现在这个不报错,要靠自己去记得改写么??? 另外你说的这种,和

@server.update(skip_params)
def skip_params
  params.require(:server).permit(:skip_check)
end

有何区别? 还有就是前端传过来的是 1 和 0 而非 true 和 false,以前是params[:skip_check].to_i.zero?判断的,现在这种如何处理?

1.我的玩法是不再使用 attr_accessible 完全采用 permit 根据需要自定义 permit 的参数。 2.这段代码定义成一个方法复用。也没问题哈

params.require(:server).permit(:skip_check...)
  1. true 和 false 的问题。可以直接传递 true 和 false 的。没必要用 0 和 1.

@hellomac

#4 楼 @suxu 脑袋笨还是没理解... 仍然不懂您是怎么来防止忘记改写的?attr_accessible 忘记授权会报个权限错误,现在的这个忘记了好像没有提示...

@hellomac 也许是我表达不清楚。笨的人不玩 rails 哈。 之前的 rails 不强迫用 attr_accessible 授权的时候。大家还是很习惯啊。 升级到 4.0 .注释到所有 attr_accessible。如果直接 update_attribute(params[:server]) 就会出现 ForbiddenAttributesProtection。加上 permit 就可以了

PS;我也不确定完全放弃 attr_accessible 的做法是否正确。我只是分享我的玩法

#6 楼 @suxu T_T 我现在的问题就是按照我帖子里说的升级过了,但是没看到 ForbiddenAttributesProtection.是不是我遗漏了什么?

#7 楼 @hellomac 去掉 strong_parameters 这个 gem

#8 楼 @suxu Gemfile 中没有指定 strong_parameters 哦,您的意思是连/config/initializers/strong_parameters.rb 也删除么,我看了下新建的 4.0 项目,确实连这个也没有。可删掉了貌似还是可以更新。😱

#9 楼 @hellomac 你帖子里的代码

@server.update(:skip_check =>true)

当然能更新!4.0 没有在强迫 使用 attr_accessible。来授权

#10 楼 @suxu 虽然还是没听懂,但仍然非常感谢。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号