Вложенный атрибут Rails с использованием данных модели - PullRequest
0 голосов
/ 19 июля 2011

Я пытаюсь создать вложенную модель, похожую на ту, что была в Railscast Ep # 196 Райана Бейтса.

Мои модели:

 class EmployeeReview < ActiveRecord::Base
  belongs_to :employee
  belongs_to :user
  has_many :review_ratings, :dependent => :destroy
  accepts_nested_attributes_for :review_ratings
  attr_accessible :employee_id


class ReviewRating < ActiveRecord::Base
 belongs_to :employee_review
 belongs_to :review_category

class ReviewCategory < ActiveRecord::Base
 has_many :review_ratings

Я уже вошел в Просмотр категорий, и у меня есть категории, выделенные в качестве модели на случай, если я хочу добавить категории в будущем. Чтобы отобразить все категории в моей форме, действие «new» в моем контроллере EmployeeReviews выглядит следующим образом:

def new
 @title = "Employee Review"
 @review = EmployeeReview.new()
 @employee = Employee.find(params[:employee_id])
 @categories = ReviewCategory.all
  @categories.each do |category|
    @rating = @review.review_ratings.build({:review_category_id => category.id})
  end
end

Затем я использую следующий код для своей формы:

<h2>Create a review for <%= @employee.first_name %> <%= @employee.last_name %></h2>

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

<% f.fields_for :review_ratings do |builder| %>
 <b><%= builder.object.review_category.name %></b><br/>
 <%= builder.label :score, "Score" %><br/>
 <%= builder.text_field :score %><br/>
 <%= builder.label :comment, "Comment" %><br/>
 <%= builder.text_area :comment %><br/>
<% end %>

Таким образом, форма работает и отображает правильные категории. Тем не менее, когда я отправляю, он создает обзор, но не сохраняет связанные с ним значения review_rating. Вот код в действии 'create' моего контроллера employee_review.

def create
 @employee = Employee.find(params[:employee_id])
 @review = EmployeeReview.new(params[:review])
 @review.user_id = current_user.id
 @review.employee_id = @employee.id
 if @review.save
  redirect_to @employee, :flash => {:success => "employee review was created"}
 else
  render 'new', :flash => {:error => "Employee review was not created"}
 end
end

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

Обновление: вот моя схема (разделы для моделей)

  create_table "review_categories", :force => true do |t|
   t.text     "description"
   t.datetime "created_at"
   t.datetime "updated_at"
   t.string   "name"
  end

  create_table "review_ratings", :force => true do |t|
   t.integer  "employee_review_id"
   t.integer  "score"
   t.text     "comment"
   t.datetime "created_at"
   t.datetime "updated_at"
   t.integer  "review_category_id"
  end

  create_table "employee_reviews", :force => true do |t|
   t.integer  "employee_id"
   t.datetime "created_at"
   t.datetime "updated_at"
   t.integer  "user_id"
  end

1 Ответ

0 голосов
/ 19 июля 2011

Начните с этого и посмотрите, действительно ли отображается fields_for.Под этим я подразумеваю, что у вас действительно есть обзор, когда вы переходите к новому действию.

def new
 @title = "Employee Review"
 @review = EmployeeReview.new()
 @employee = Employee.find(params[:employee_id])
 @categories = ReviewCategory.all
 conditions = {:review_category_id => ReviewCategory.first.id}
 @rating = @review.review_ratings.build(conditions)
end

Сначала мы должны увидеть, действительно ли работает fields_for, а затем можем ли вы сделать что-то нестандартное.Дайте мне знать, что происходит, когда вы меняете этот код.

...