Массовое назначение атрибутов не выполняется во вложенной форме.Тихая ошибка? - PullRequest
1 голос
/ 11 января 2012

Здесь есть несколько вопросов, которые охватывают это уже , я знаю.Я новичок в программировании и рельсах, поэтому, пожалуйста, потерпите меня.Моя цель - собрать n теговых объектов и отобразить их в моих действиях по показу и индексированию.

ОБНОВЛЕНИЕ Спасибо обоим ребятам, которые ответили.Каждое предложение подталкивало меня в правильном направлении.Я могу получить задачу rake для создания сообщений, передав пустой массив для инициализации объекта tags.Однако теги до сих пор не созданы.При дальнейшей проверке я получаю следующее исключение SQL:

irb(main):002:0> u.posts.build(title: "a new day", tags: "jump")
WARNING: Can't mass-assign protected attributes: tags
(1.7ms)  SELECT 1 FROM "posts" WHERE "posts"."title" = 'a new day' LIMIT 1
(0.5ms)  COMMIT
 => #<Post id: nil, title: "a new day", description: nil, content: nil, user_id: 1,    created_at: nil, updated_at: nil>

Моя установка выглядит следующим образом:

Tag Модель

class Tag < ActiveRecord::Base

belongs_to :post

end

Post Модель

class Post < ActiveRecord::Base

has_many :tags, autosave: true
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?}}
#add n number of form fields to capture tags in each article.
   def with_blank_tags(n = 3)
     n.times do
       tags.build
     end
     self
    end
end

код «Просмотр»

<%= form_for(@post.with_blank_tags) do |f| %>
<div class="field">
  <%= f.fields_for(:tags) do |tags| %>
   <%= unless tags.object.new_record? tags.check_box('_destroy') + tags.label('_destroy', 'Remove Tag') end%>
   <%= tags.label :tags, "Add a Tag"%>
   <%= tags.text_field :tags %>
  <%end%>   
</div>
<%end%>

код «Контроллер»

def new
 @post = @user.posts.build
end

def create
 @post = @user.posts.build(params[:post])
  if @post.save?
   respond_to do |format|
     format.html { redirect_to @post, notice: 'Post was successfully created.' }
    else
     format.html { render action: :new }
    end
   end
end

Моя задача по рейку:

namespace :db do
desc "Fill database with sample data"
task :posts => :environment do
 Rake::Task['db:reset'].invoke
  make_users
  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_posts
 puts "making posts..."
User.all(:limit => 3).each do |user|
  10.times do
    content = Faker::Lorem.paragraphs(3)
    description = Faker::Lorem.words(10)
    title = Faker::Lorem.words(4)
    tag = []
    post = user.posts.create!(title: title, description: description, content: content, tags_attributes: tag)
  end
 end
end

Ответы [ 3 ]

1 голос
/ 11 января 2012

Если вы объявите некоторые атрибуты как attr_accessible для модели в рельсах, тогда все остальные атрибуты будут автоматически установлены как attr_protected. Похоже, ваша проблема может быть связана с тем, что вы пытаетесь создать сообщение и одновременно назначить атрибут tags. Попробуйте добавить :tags в список attr_accessible атрибутов в вашей Post модели и посмотрите, исправит ли это.

0 голосов
/ 12 января 2012

Я смог решить проблему. После rdocs здесь , чтобы установить вложенный атрибут, вы передаете массив хэшей атрибутам * _atatributes. Это устраняет ошибку, описанную выше, и устанавливает идентификатор объекта tags_id.

Все, что мне нужно было сделать, это удалить эту строку:

tag = []
post = user.posts.create!(title: title, description: description, content: content, tags_attributes: tag)

и замените его этим в моей грабли:

tag = Faker::Lorem.words(1) # create a tag
post = user.posts.create!(tags_attributes: [tags: tags])

Теперь, когда я делаю что-то вроде Tag.all со своей консоли, я вижу:

[#<Tag id: 1, post_id: 1, tags: "---\n- adipisci\n", created_at: "2012-01-12 06:31:13", updated_at: "2012-01-12 06:31:13">,
0 голосов
/ 12 января 2012

В #create на вашем контроллере вы не хотите звонить @post.save? Вам также не нужен второй метод .tags. Просто простое:

def create
  @post = @user.posts.build(params[:post])
  if @post.save
    redirect_to @post, notice: 'Post was successfully created.' }
  else
    render action: :new
  end
end
...