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 に答える