【问题标题】:Mass assignment error in polymorphic favourite model setup多态喜爱模型设置中的质量分配错误
【发布时间】:2012-10-15 20:45:08
【问题描述】:

我正在尝试将收藏添加到我的应用中,以便用户可以选择喜欢的项目。

我尝试使用我在此处找到的代码:http://snippets.aktagon.com/snippets/588-How-to-implement-favorites-in-Rails-with-polymorphic-associations

这是我目前的情况:

user.rb

class User < ActiveRecord::Base
  has_many :projects
  has_many :favourites
  has_many :favourite_projects, :through =>  :favourites, :source => :favourable, :source_type => "Project"
end

project.rb

class Project < ActiveRecord::Base
  belongs_to :user
  has_many :tasks
  accepts_nested_attributes_for :tasks
  has_many :favourites, :as => :favourable
  has_many :fans, :through => :favourites, :source => :user
end

task.rb

class Task < ActiveRecord::Base
  belongs_to :project
end

favourite.rb

class Favourite < ActiveRecord::Base
  belongs_to :user
  belongs_to :favourable, :polymorphic => true
  attr_accessible :user, :favourable
end

favourite_spec.rb

require 'spec_helper'

describe Favourite do
  let(:user) { FactoryGirl.create(:user) }
  let(:project) { FactoryGirl.create(:project_with_task) }
  let(:favourite_project) do
    user.favourite_projects.build(favourable: project.id)
  end

  subject { favourite_project }

  it { should be_valid }

  describe "accessible attributes" do
    it "should not allow access to user_id" do
      expect do
        Favourite.new(user_id: user.id)
      end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)
    end
  end

end

但当我运行测试时,user_id 测试通过但我得到it { should be_valid } 的以下内容:

Failure/Error: user.favourite_projects.build(favourable: project.id)
     ActiveModel::MassAssignmentSecurity::Error:
       Can't mass-assign protected attributes: favourable

我在测试中做错了吗?

或者我打电话给.build的方式?

或者在收藏模型上的attr_accessible

希望有人能提供帮助!

【问题讨论】:

    标签: ruby-on-rails-3 activerecord rspec polymorphic-associations mass-assignment


    【解决方案1】:

    解决了!

    以下是问题中显示的必须更改的文件:

    收藏夹.rb

    class Favourite < ActiveRecord::Base
      belongs_to :user
      belongs_to :favourable, :polymorphic => true
      attr_accessible :favourable
    end
    

    favourite_spec.rb

    require 'spec_helper'
    
    describe Favourite do
      let(:user) { FactoryGirl.create(:user) }
      let(:project) { FactoryGirl.create(:project_with_task) }
      let(:favourite_project) do
        user.favourites.build(favourable: project)
      end
    
      subject { favourite_project }
    
      it { should be_valid }
    
      describe "accessible attributes" do
        it "should not allow access to user_id" do
          expect do
            Favourite.new(user_id: user.id)
          end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)
        end
        it "should not allow access to user" do
          expect do
            Favourite.new(user: user)
          end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)
        end
      end
    
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多