Проблемы с вложенными формами в Rails (поле ввода не отображается; при создании возвращается неопределенная ошибка метода) - PullRequest
1 голос
/ 14 марта 2012

У меня проблема с созданием вложенной формы.

Одна проблема заключается в том, что поле ввода текста для дочернего элемента (описание проекта) не отображает .

Вторая проблема заключается в том, что после создания нового проекта действие index возвращает «неопределенный метод для nil-объекта» . Я думаю, что это из-за полного отсутствия ProjectDecription (он не может вернуть project.project_description.description, если project_description не существует).

Кроме того, ProjectDescription успешно сохраняется в базе данных (без описания проекта). Пожалуйста, помогите.

Это мои модели в вопросе:

а) Модель проекта

  1  class Project < ActiveRecord::Base
  2   has_one :project_description
  3   accepts_nested_attributes_for :project_description
  4  end

б) Модель ProjectDescription

  1 class ProjectDescription < ActiveRecord::Base
  2   belongs_to :project
  3 end

Это мой проект_контроллер.rb

  1 class ProjectsController < ApplicationController
  2     
  3   def index
  4     @projects = Project.all
  5   end 
  6     
  7   def new
  8     @project = Project.new
  9     @project.project_description = ProjectDescription.new
 10   end 
 11     
 12   def create
 13     @project = Project.new(params[:project])
 14       
 15     if @project.save
 16       redirect_to (projects_path)
 17     else
 18       new_project_path
 19     end
 20   end 
 21 
 22   def show
 23     @project = Project.find(params[:id])
 24   end
 25
 26  end

Это мое представление projects / index.html.erb (я думаю, что строка 5 вызывает неопределенную ошибку метода)

  1 <%= link_to 'Create new project', new_project_path %>
  2   <h1>Projects</h1>
  3   <% @projects.each do |p| %>
  4     <h2><%= link_to p.project_name, project_path(p) %></h2>
  5     <%= p.project_description.description %>
  6     <br/>
  7     <% p.users.each do |u| %>
  8       <%= u.user_name %>
  9       <br/>
 10     <% end %>
 11     <br/>
 12   <% end %>

Это мой просмотр projects / new.html.erb (текстовое поле, указанное в строке 9, не отображается)

  1 <h2>Create new Project</h2>
  2 <%= form_for @project do |f| %>
  3   Project name:
  4   <%= f.text_field :project_name %><br/>
  5 
  6   Project descripiton:
  7   <% @project.build_project_description unless @project.project_description %>
  8   <% f.fields_for :project_description do |builder| %>
  9     <%= builder.text_field :description %>
 10   <% end %>
 11   <br/>
 12   <%= submit_tag ("Create Project") %>
 13 <% end %>

1 Ответ

1 голос
/ 14 марта 2012

Строка <%= p.project_description.description %> выдает ошибку, поскольку существует хотя бы один проект без описания, поэтому p.project_description возвращает nil, а следующий вызов nil.description выдает ошибку NoMethodError (nil не имеет description метод). Элегантный способ разрешения этих ситуаций - метод try (об этом можно прочитать здесь ):

<%= p.project_description.try(:description) %>

Эта строка вернет nil, если project_description равно nil, в противном случае будет возвращено значение поля description.

Что касается второй проблемы, я думаю, что код, который вы разместили, должен работать; в любом случае, попробуйте это:

<% f.fields_for @project.project_description do |builder| %>
  <%= builder.text_field :description %>
<% end %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...