2012-02-13 3 views
3

См. Также this post.Исключение массового назначения не найдено объяснений (Rails 3.2.1)

Примечание: Текущая задача грабли сохраняет объекты «Пользователь» и «Тема», но не сообщения или теги при установке объекта post.

Вопрос: Каким образом можно описать эту взаимосвязь в моей задаче rake (показано ниже), чтобы она не выбрасывала . Нельзя назначать атрибуты исключения?

Вот мои шаги:

Шаг 1: Создание модели

class Post < ActiveRecord::Base 
    belongs_to :topic, inverse_of: :posts 
    has_and_belongs_to_many :tags 
    attr_accessible :title, :description, :content, :tags_attributes 
    accepts_nested_attributes_for :tags, allow_destroy: true, reject_if: lambda {|attrs| attrs.all? {|key, value| value.blank?}} 
end 

class Tag < ActiveRecord::Base 
has_and_belongs_to_many :posts 
attr_accessible :tag_name #UPDATE 
end 

class Topic < ActiveRecord::Base 
    has_many :posts, inverse_of: :topic 
    attr_accessible :topic_name, :posts_attributes 
    accepts_nested_attributes_for :posts, allow_destroy: true, reject_if: lambda {|attrs| attrs.all? {|key, value| value.blank?}} 
end 

Поэтому моя Post модель является дочерним Topic и пост имеет отношение HABTM с Tags.

Шаг 2: Создание грабли задача

namespace :db do 
desc "Fill database with sample data" 
task :posts => :environment do 
Rake::Task['db:reset'].invoke 
make_users 
make_topics 
make_posts 
end 
end 

def make_users 
puts "making users" + "..." 
5.times do |n| 
    name = Faker::Name.name 
    password = "foo" 
    email = "example-#{n+1}@example.com" 
    user = User.create!(
       codename: name, 
       email: email, 
       password: password, 
       password_confirmation: password) 
end 
end 

def make_topics 
    puts "making topics"+"..." 
    3.times do 
    t = Faker::Lorem.words(1) 
    topic = Topic.create!(topic_name: t) 
end 
end 

def make_posts 
puts "making posts" + "..." 
User.all(limit: 3).each do |user| 
    Topic.all.each do |topic| 

    10.times do 
     content = Faker::Lorem.paragraphs(3) 
     description = Faker::Lorem.words(10) 
     title = Faker::Lorem.words(4) 
     tag_1 = Faker::Lorem.words(1) 
     tag_2 = Faker::Lorem.words(1) 
     tag_3 = Faker::Lorem.words(1) 
     post = user.posts.create!(title: title, 
           posts_attributes: [{topic_name: @topic}], 
           description: description, 
           content: content, 
           tags_attributes: [{tag_name: tag_1}, {tag_name: tag_2}, {tag_name: tag_3}]) 
    end 
    end 
end 

конец

Шаг 3: Теперь запустите реки задача

... 
making users... 
making posts... 
rake aborted! 
Can't mass-assign protected attributes: posts_attributes 
... 
... 
/lib/tasks/make_posts.rake:45:in `block (3 levels) in make_posts' 
/lib/tasks/make_posts.rake:38:in `times' 
/lib/tasks/make_posts.rake:38:in `block (2 levels) in make_posts' 
/lib/tasks/make_posts.rake:36:in `each' 
/lib/tasks/make_posts.rake:36:in `block in make_posts' 
/lib/tasks/make_posts.rake:35:in `each' 
/lib/tasks/make_posts.rake:35:in `make_posts' 
/lib/tasks/make_posts.rake:7:in `block (2 levels) in <top (required)>' 

... 
... 

Теперь, так как я не мог получить мои грабли задача, я пошел в консоль, и вот ошибка:

Topic Load (1.5ms) SELECT "topics".* FROM "topics" LIMIT 1 
=> #<Topic id: 1, topic_name: "---\n- aut\n", created_at: "2012-02-14 21:06:41", updated_at: "2012-02-14 21:06:41"> 
irb(main):007:0> topic.posts_attributes = {"1"=>{tag_name:"hammer time"}} 
ActiveModel::MassAssignmentSecurity::Error: Can't mass-assign protected attributes: tag_name 
from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security/sanitizer.rb:48:in `process_removed_attributes' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security/sanitizer.rb:20:in `debug_protected_attribute_removal' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security/sanitizer.rb:12:in `sanitize' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activemodel-3.2.1/lib/active_model/mass_assignment_security.rb:228:in `sanitize_for_mass_assignment' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/attribute_assignment.rb:75:in `assign_attributes' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/base.rb:495:in `initialize' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/reflection.rb:183:in `new' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/reflection.rb:183:in `build_association' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/associations/association.rb:233:in `build_record' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/associations/collection_association.rb:112:in `build' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/nested_attributes.rb:405:in `block in assign_nested_attributes_for_collection_association' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/nested_attributes.rb:400:in `each' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/nested_attributes.rb:400:in `assign_nested_attributes_for_collection_association' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/activerecord-3.2.1/lib/active_record/nested_attributes.rb:288:in `posts_attributes=' 
    from (irb):7 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:47:in `start' 
    from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands/console.rb:8:in `start' 
from /home/rhodee/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/railties-3.2.1/lib/rails/commands.rb:41:in `<top (required)>' 
    from script/rails:6:in `require' 
    from script/rails:6:in `<main>'irb(main):008:0> 

ответ

0

Зачем вы проходите: posts_attributes - user.posts.create? Мне кажется, что вы хотите создать тему, в которой есть много сообщений, и в этом случае вы должны делать user.topics.create.

+0

Спасибо за понимание! – rhodee

Смежные вопросы