2012-03-14 32 views
1

我有創建嵌套窗體的問題。Rails中嵌套窗體的問題(輸入字段不顯示;創建返回未定義的方法錯誤)

一個問題是子元素(項目描述)的文本輸入字段未顯示

第二個問題是,一旦我創建一個新的項目,索引操作返回'未定義的方法爲零對象'。我認爲這是因爲完全沒有ProjectDecription(如果project_description不存在,它不能返回project.project_description.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 

這是我projects_controller.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 

這是我的項目/ 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 %> 

這是我的項目/ 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

<%= p.project_description.description %>因爲至少有一個項目,而不描述,所以p.project_description返回nil引發錯誤,下一個呼叫nil.description拋出一個NoMethodError(nil有着不description方法)。要解決這些情況下一種優雅的方式是try方法(你可以讀到它here):

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

這條線將返回nil如果project_descriptionnil,否則將返回description字段的值。

關於第二個問題,我認爲你發佈的代碼應該工作;無論如何,試試這個:

<% f.fields_for @project.project_description do |builder| %> 
    <%= builder.text_field :description %> 
<% end %> 
+0

你先生是一個紳士和學者。第一個問題解決。第二個問題仍然存在。仍然沒有顯示文本字段。有其他想法嗎? – oFca 2012-03-14 15:54:13

+0

謝謝:)對不起,對於延遲,我沒​​有看到評論>。<無論如何,我想我發現錯誤:在fields_for:<%= f開始處有一個缺少'='的地方。 fields_for:project_description do | builder | %>' – mdesantis 2012-03-19 17:10:37