2012-08-02 67 views
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 

回答

1

更改此:

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

要這樣:

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

然後它應該工作。

+0

謝謝!有用! – 2012-08-02 14:51:10

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

+0

謝謝回答。但我認爲用戶就是學生。所以用戶(學生)可以選擇課程。 – 2012-08-02 10:48:53

+0

是的。在你的例子中。那麼問題是什麼?然後你將學生添加到課程(c)(ie學生<< s) – Roger 2012-08-02 11:21:47

+0

我不知道爲什麼我得到這個錯誤消息:'ActiveModel :: MassAssignmentSecurity :: Error:Can not mass-assign protected屬性:用戶,當然' – 2012-08-02 11:29:38

1

默認情況下,由於github在受到攻擊後受到攻擊3.2.3,所以默認情況下會執行質量分配。

爲此你現在需要的質量分配警告(不是個好主意)

或設置或者通過在模型中的黑色或白名單屬性的保護水平的任何轉變。

白名單可以這樣做:(我強烈建議這個方法)

attr_accessible :user_id, :course 

或黑名單設置:

attr_protected :is_admin, :pasword_salt 

檢查了這一點更多信息
http://api.rubyonrails.org/classes/ActiveModel/MassAssignmentSecurity/ClassMethods.html

相關問題