Как мне создать form_for для вложенных ресурсов пространства имен в Rails 3.1.3 и Mongoid? - PullRequest
0 голосов
/ 13 декабря 2011

Я новичок в Rails и пытаюсь создать API для мобильного приложения.Хотя Api будет генерировать ответы JSON, мне также нужен веб-интерфейс для создания данных.Мои маршруты выглядят так:

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 %>

Я не могу заставить это работать.Я могу заставить страницу обновлений работать, но после того, как я нажимаю на кнопку «Отправить», я получаю сообщение об ошибке:

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

Как мне получитьэто на работу?Я перепробовал все возможные варианты решения, но он не работает.Также я пользуюсь Райаном Бейтсом Railcast

Заранее спасибо.

1 Ответ

0 голосов
/ 15 декабря 2011

Вы получаете undefined method 'movie' for nil:NilClass, потому что вы ссылаетесь на @ reldate.movie и назначаете @ api1_reldate в контроллере.Выберите один.

Кроме того, я не уверен, отличаются ли потребности mongoid, но AR использует массив для маршрутов с пространством имен и form_for:

From: http://apidock.com/rails/ActionView/Helpers/FormHelper/form_for

Для маршрутов с пространством имен, таких как admin_post_url:

<%= form_for([:admin, @post]) do |f| %>
 ...
<% end %>

Я думаю, вам нужно:

form_for [:api1, Movie.new] do

Ваш пример кода показывает, что вы можете захотеть:

form_for [:api1, @reldate.movie] do

Не видяконтроллер, я не могу сказать, является ли @ reldate.movie новым фильмом, но я сомневаюсь в этом.

...