【发布时间】:2011-12-13 04:44:52
【问题描述】:
我是 Rails 新手,正在尝试为移动应用创建 Api。虽然 Api 会生成 json 响应,但我还需要一个 Web 界面来创建数据。我的路线如下所示:
Appone::Application.routes.draw do
namespace :api1 do
resources :reldates do
resources :movies
end
end
end
release_date 模型:
class Api1::Reldate
include Mongoid::Document
include Mongoid::MultiParameterAttributes
include Mongoid::Timestamps
field :release_date, :type => Date
embeds_many :api1_movies
validates_associated :movie
accepts_nested_attributes_for :movie
end
电影模特:
class Api1::Movie
include Mongoid::Document
include Mongoid::MultiParameterAttributes
include Mongoid::Timestamps
field :title, :type => String
field :release_type, :type => String
field :release_number, :type => Integer
embedded_in :api1_reldate, :inverse_of => :api1_movies
end
和相关的 show.html.erb:
<p id="notice"><%= notice %></p>
<p>
<b>Release date:</b>
<%= @api1_reldate.release_date %>
</p>
<% if @api1_reldate.api1_movies.size > 0 %>
<h2>Movies</h2>
<% for api1_movie in @api1_reldate.api1_movies %>
<h3><%= api1_movie.title %></h3>
<p><%= api1_movie.release_type %></p>
<p><%= api1_movie.release_number %></p>
<% end %>
<% end %>
<h2>New Movies</h2>
<% form_for([:api1], :url => { :action => :create ,:id => @reldate.movie}) do |form| %>
<p><%= f.label :title %> <%= f.text_field :title %></p>
<p><%= f.label :release_type %> <%= f.text_field :release_type %></p>
<p><%= f.label :release_number %> <%= f.number_field :release_number %></p>
<p><%= f.submit %></p>
<% end %>
<%= link_to 'Edit', edit_api1_reldate_path(@api1_reldate) %> |
<%= link_to 'Back', api1_reldates_path %>
我无法让它工作。我可以让 reldate 页面正常工作,但点击提交后,我收到如下错误:
undefined method `movie' for nil:NilClass
Extracted source (around line #18):
15: <% end %>
16:
17: <h2>New Movies</h2>
18: <% form_for([:api1], :url => { :action => :create ,:id => @reldate.movie}) do |form| %>
19: <p><%= f.label :title %> <%= f.text_field :title %></p>
20: <p><%= f.label :release_type %> <%= f.text_field :release_type %></p>
21: <p><%= f.label :release_number %> <%= f.number_field :release_number %></p>
电影控制器如下所示:
class Api1::MoviesController < ApplicationController
def create
@api1_reldate = Api1::Reldate.find(params[:api1_reldate_id])
@api1_movie = @api1_reldate.api1_movies.create!(params[:api1_movie])
redirect_to @api1_reldate, :notice => "Movie successfully created!"
end
end
我怎样才能让它工作?我已经尝试了所有可能的解决方案,但总是失败。 另外,我正在使用 Ryan Bates Railcast
提前致谢。
【问题讨论】: