У меня есть таблица страниц и таблица автора.Каждая страница принадлежит одному автору.Созданы миграции для таблиц и моделей.Но получая эту ошибку при использовании в форме:
NoMethodError in Pages#new
Showing C:/rorapp/app/views/pages/_form.html.erb where line #1 raised:
undefined method `build' for nil:NilClass
Extracted source (around line #1):
1: <%= form_for(@page, @page.author.build) do |f| %>
2: <% if @page.errors.any? %>
3: <div id="error_explanation">
4: <h2><%= pluralize(@page.errors.count, "error") %> prohibited this post from being saved:</h2>
Trace of template inclusion: app/views/pages/new.html.erb
Rails.root: C:/rorapp
Application Trace | Framework Trace | Full Trace
app/views/pages/_form.html.erb:1:in `_app_views_pages__form_html_erb___998576952_54480300'
app/views/pages/new.html.erb:2:in `_app_views_pages_new_html_erb__638997451_40207104'
Request
Parameters:
None
Show session dump
Show env dump
Response
Headers:
None
Вот мой файл модели для автора:
class Author < ActiveRecord::Base
has_one :page
end
И модель страницы:
class Page < ActiveRecord::Base
validates :title, :presence => true
belongs_to :author
end
ИВот фрагмент формы модели:
<%= form_for(@page, @page.author.build) do |f| %>
<% if @page.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@page.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @page.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
Есть идеи, как это сделать?
спасибо
РЕДАКТИРОВАТЬ - 1
Вотмой метод действия называется new
:
def new
@page = Page.new
@page.build_author
end
И вот форма, которую он отображает:
<%= form_for(@page) do |f| %>
<% if @page.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@page.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% @page.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= f.label :title %><br />
<%= f.text_field :title %>
</p>
<p>
<%= f.label :body %><br />
<%= f.text_area :body %>
</p>
<p>
<%= f.label :author %><br />
<%= f.text_field :author %>
</p>
<p>
<%= f.label :email %><br />
<%= f.text_field :email %>
</p>
<p>
<%= f.label :reference %><br />
<%= f.select(:reference,[['google',1],['yahoo',2],['MSN',3],['Ask',4]]) %>
</p>
<%= f.submit "Submit" %>
<% end %>
РЕДАКТИРОВАТЬ - 2
Вот мой код контроллера:
class PagesController < ApplicationController
def index
@total = Page.count
@pages = Page.find(:all)
end
def show
@page = Page.find(params[:id])
end
def new
@page = Page.new
@page.build_author
end
def create
@page = Page.new(params[:page])
if @page.save
redirect_to pages_path, :notice => "The data has been saved!"
else
render "new"
end
end
def edit
@page = Page.find(params[:id])
end
def update
@page = Page.find(params[:id])
if @page.update_attributes(params[:page])
redirect_to pages_path, :notice => "Your post has been updated!"
else
render "edit"
end
end
def destroy
@page = Page.find(params[:id])
@page.destroy
redirect_to pages_path, :notice => "Your page has been deleted!"
end
end