无法批量分配受保护的属性:用户,课程

时间:2012-08-02 10:01:30

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

我想用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

3 个答案:

答案 0 :(得分:1)

您可以向学生添加课程(反之亦然),如下所示:

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

答案 1 :(得分:1)

改变这个:

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

对此:

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

然后它应该工作。

答案 2 :(得分:1)

默认情况下进行质量分配是因为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