2012-01-11 1 views
1

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

ОБНОВЛЕНИЕ Спасибо, что оба парня ответили. Каждое предложение подтолкнуло меня в правильном направлении. Я могу получить задачу 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 Model

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 

'View' код

<%= 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%> 

код 'Controller'

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 
+0

Я был бы удивлен, если это имеет значение. Но многие другие вопросы и примеры, которые видели в Интернете до сих пор, были связаны с вложенными атрибутами атрибутов перед вызовом attr_accessible. Может быть, это нужно определить перед тем, как ввести # {name} _attributes white? – agmcleod

+0

@agmcleod Я поместил вызов в том порядке, в котором вы предлагали, и получил то же исключение. – rhodee

+0

@agmcleod Я столкнулся с решением в этой статье [http://stackoverflow.com/questions/2792622/what-does-this-rake-dbseed-error-mean], которая предполагает переименование модели. Интересно, не допустимо ли название тега для модели? – rhodee

ответ

0

Я был в состоянии решить эту проблему. После rdocs here, чтобы установить свой вложенный атрибут, вы передаете массив хэшей в * _attributes. Это устраняет описанную выше ошибку и задает идентификатор объекта 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 из моей консоли I см.:

[#<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">, 
1

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

+0

Спасибо, @ Баткинс. Я сделал изменение и получил следующую ошибку в консоли 'rake aborted! Тег (# 38643420) ожидается, получил строку (# 18449760) ' – rhodee

+0

. Я не уверен, что вы можете создать сообщение через пользовательские отношения и создать тег через связь post в одной строке. Как и в, '@post = @ user.posts.build (теги: Tag.new)', возможно, необходимо разбить на '@post = @ user.posts.build', а затем новую строку с' @post.tags .build'. Это просто догадка. – Batkins

+0

Ну, во всяком случае, похоже, что мой ответ решил проблему, когда вы пытались «не перенаправлять защищенные атрибуты», что было проблемой, которую вы испытывали, когда задавали вопрос, так что бы вы приняли мой ответ как правильный ? Вы можете представить новую ошибку как отдельный вопрос. – Batkins

0

В #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 
+0

Это было правильно в моей кодовой базе, но не в этом сообщении. Произошла такая же ошибка. – rhodee

+0

Следуя вашим предложениям и удаляя «теги» из вызова attr_accessible, можно создать образцы данных. Спасибо. – rhodee

+0

После проверки объекта 'post' в моей консоли, объект тега не сохранил. есть идеи? – rhodee

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

  • Нет связанных вопросов^_^