在 Rails 控制台中创建实例时,Rails 4 强参数失败

2024-05-06

可能在这里做了一些愚蠢的事情,但这是我的基本千篇一律的课程:

class League < ActiveRecord::Base

    private
      def league_params
        params.require(:full_name).permit!
      end

end

创建 League 的新实例时:

2.0.0-p0 :001 > l = League.new(full_name: 'foo', short_name: 'bar')
WARNING: Can't mass-assign protected attributes for League: full_name, short_name

我到底做错了什么?这是 Rails 4.0.0.beta1 版本 + Ruby 2.0

** 更新 **

我现在意识到强参数现在是在控制器中强制执行的,而不是在模型中强制执行的。原来的问题仍然存在。如果在控制器级别允许它们,那么当我在 Rails 控制台中创建实例时,如何正确地将属性列入白名单?我不需要也使用吗attr_accessible在这种情况下,也因此完全重复了哪些强参数试图“修复”?


两件事情。这league_params定义位于控制器中,而不是模型中。和params.require()应包含参数中需要出现的模型名称,而不是属性。属性存在检查仍应在模型验证中。在使用之前,请确保您确实希望允许访问联赛模型中的所有属性permit!。所以,它应该看起来像这样:

class LeaguesController < ApplicationController

  private
    def league_params
      params.require(:league).permit!
    end

end

Update:

是的,如果您希望直接访问模型时限制属性,则需要切换回使用attr_accessible在模型中。该功能已移至此 gem 中:https://github.com/rails/protected_attributes https://github.com/rails/protected_attributes.

我认为假设如果您直接在控制台中使用模型,则不需要保护属性,因为您确切知道正在输入的内容。由于控制台可以完全访问您的应用程序,因此控制整个数据库就像恶意分配属性一样容易。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rails 控制台中创建实例时,Rails 4 强参数失败 的相关文章

随机推荐