Rails 3 railscast #196, цикл 3.times не работает

Я нашел много сообщений об этом Railscast, но все предложения не помогли мне. Мне удалось отобразить в представлении вложенное поле формы, но только одно, а не 3, которые я вызвал в своем контроллере. Когда я отправляю, я получаю сообщение об ошибке: Не удается массово назначить защищенные атрибуты: подсказка

Глава.rb

class Chapter < ActiveRecord::Base
 belongs_to :trail
 has_many :clues, :dependent => :destroy
 accepts_nested_attributes_for :clues
 attr_accessible :asset, :assetkind, :description, :gate, :name, :trail, :trail_id, :cover
.
.
.

end

Подсказка.rb

class Clue < ActiveRecord::Base
 attr_accessible :chapter_id, :theclue, :typeof, :chapter
 .
 .
 .
 belongs_to :chapter
end

В железнодорожной передаче говорится использовать эквивалент :clues, и это отображает 3 поля. Но в моем случае это не отображало поля. Вместо этого я использую @chapter.clues, и он отображает только один.

Моя форма при создании новой главы.

<h1>Add a New Chapter</h1>
<h3>Add To Trail : <%= @trail.title %></h3><br>
<%= form_for [@trail, @trail.chapters.build] do |f| %>

<h6>About the Chapter</h6>
    <%= f.label :name, 'Chapter Name' %>
    .
    .
    .
<h6>Progressing the Story</h6>
    <%= f.fields_for @chapter.clues do |builder| %>
    <p>
        <%= builder.label :theclue, "Enter Clue" %>
        <%= builder.text_area :theclue, :rows => 2 %>
    </p>
<% end %>
     .
     .
     .
<% end %>

Мои главы_controller.rb новые

class ChaptersController < ApplicationController

def new
  @trail = Trail.find(params[:trail_id])
  @chapter = Chapter.new
  @title = "Chapter"
  3.times { @chapter.clues.build }
  logger.debug "CHAPTER!!!!!!!!!!!!new: am i in a trail? #{@trail.to_yaml}"
  logger.debug "CHAPTER!!!!!!!!!!!!new: am i in a clue? #{@chapter.clues.to_yaml}"
end

Мой журнал показывает мне 3 подсказки, но атрибуты пусты (нет: id). Это признак того, что что-то не так? Таким образом, несмотря на то, что в моем журнале отображаются 3 объекта-подсказки, в моем представлении отображается только один.

Мысли? Я уже, благодаря предложениям по stackoverflow, добавил в Chapter.rb

attr_accessible :clues_attributes 

и не повезло, такое же поведение и ошибки с этим и без него.

Спасибо заранее за ваше время


person HappaGirl    schedule 16.05.2012    source источник


Ответы (2)


Я понял это для себя. Не уверен, почему именно, я предположу, кто-то может объяснить это лучше, если я уйду.

Проблема была здесь:

<%= form_for [@trail, @trail.chapters.build] do |f| %>

который я изменил на:

<%= form_for @chapter do |f| %>

а затем мне пришлось изменить кое-что в моем Chapters_controller, чтобы сделать объекты следов и захватить идентификаторы. Но после того, как я внес это изменение, мои 3 поля подсказки начали отображаться в представлении, и моя ошибка о массовом назначении исчезла.

Я думаю, что глава, которую я создал ранее, была пустой и на самом деле не сгенерирована, а содержала только информацию, поэтому попытка сохранить вложенную информацию с подсказками form_for была еще одним шагом временных данных... Где создание объекта в моем контроллере, а затем заполнение его форма была более существенной.... Я знаю, действительно технически... Как я уже сказал, у меня это работает, не спрашивайте меня как... но я начинаю понимать, как думает Rails.

person HappaGirl    schedule 16.05.2012

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

Это говорит вам о том, что атрибут защищен от массового присвоения. По сути, единственный способ, которым вы могли бы установить его, - это метод в вашем коде, а не пользовательский ввод. (Как правило, они назначаются через update_attributes модели.)

Что вам нужно сделать, так это добавить :clue в attr_accessible в models/chapter.rb.

Вы также можете добавить :clues - я думаю, что на самом деле это должно дать вам ошибку, что :clues защищен. Вы можете столкнуться с проблемой с :clue_ids. Что бы он ни говорил, он защищен, просто добавьте метод attr_accessible в эту модель, и вы сможете обновить его с помощью пользовательского ввода.

person RFC1337    schedule 16.05.2012
comment
Спасибо за ваш ответ. Я попытался добавить :clues и :clues_attributes в главу atrr_accessible и получил ту же ошибку: Невозможно массово назначить защищенные атрибуты: ключ .... когда я использую: ключ, я получаю сообщение об ошибке: неизвестный атрибут: ключ ... ? - person HappaGirl; 16.05.2012