0

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

3 回答 3

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

于 2012-08-02T10:12:43.347 回答
1

改变这个:

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

对此:

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

然后它应该工作。

于 2012-08-02T14:17:44.020 回答
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

于 2012-08-02T15:20:26.680 回答