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