【问题标题】:Can't mass-assign protected attributes: user, course无法批量分配受保护的属性:用户、课程
【发布时间】:2012-08-02 10:01:30
【问题描述】:

我想用 Rails 做一个关于学校学生和课程关系的项目。一个学生可以有很多课程,一个课程可以有很多学生。因此,我认为学生和课程的关系是“多对多”

我去了控制台:

u = User.first
User Load (0.7ms)  SELECT "users".* FROM "users" LIMIT 1
...
c = Course.first
Course Load (0.8ms)  SELECT "courses".* FROM "courses" LIMIT 1
...
UserCourseship.create( :user => u, :course => c )

那么我得到的错误是:

ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes:user, course

这是我的user.rb

class User < ActiveRecord::Base
  has_many :user_courseships
  has_many :courses, :through => :user_courseships

    def self.from_omniauth(auth)
        where(auth.slice(:provider, :uid)).first_or_initialize.tap do |user|
            user.provider = auth.provider
            user.uid = auth.uid
            user.name = auth.info.name
            user.oauth_token = auth.credentials.token
            user.oauth_expires_at = Time.at(auth.credentials.expires_at)
            user.save!
        end
    end

    def facebook
      @facebook ||= Koala::Facebook::API.new(oauth_token)
    end
end

我的course.rb

class Course < ActiveRecord::Base
  has_many :user_courseships
  has_many :users, :through => :user_courseships
  attr_accessible :name, :sn, :time
end

user_courseship.rb的关系

class UserCourseship < ActiveRecord::Base
  belongs_to :user
  belongs_to :course
  attr_accessible :course_id, :user_id
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 relationship


    【解决方案1】:

    改变这个:

    UserCourseship.create( :user => u, :course => c )
    

    到这里:

    UserCourseship.create( :user_id => u.id, :course_id => c.id )
    

    然后它应该可以工作。

    【讨论】:

      【解决方案2】:

      您可以像这样向学生添加课程(反之亦然):

      c = Course.first
      s = Student.first
      s.save
      
      s.courses << c
      
      #Other way around
      
      c.students << s
      c.save
      

      看看:accepts_nested_attributes_for

      http://guides.rubyonrails.org/security.html#mass-assignment

      【讨论】:

      • 感谢您的回答。但我认为用户是学生。所以用户(学生)可以选择课程。
      • 是的。在你的例子中。那有什么问题呢?然后将学生添加到课程 (c) 中(即 c.students
      • 不知道为什么会收到这个错误信息:ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes:user, course
      【解决方案3】:

      在 github 成为攻击的受害者之后,从 rails 3.2.3 开始,默认启用批量分配。

      因此,您现在需要打开批量分配警告(不是一个好主意)

      或通过模型中的黑名单或白名单设置属性的保护级别。

      白名单可以通过:(我强烈推荐这种方法)

      attr_accessible :user_id, :course
      

      或通过黑名单设置:

      attr_protected :is_admin, :pasword_salt
      

      查看此处了解更多信息
      http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        • 2012-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多