【问题标题】:How do I create form_for for namespaced nested resources in Rails 3.1.3 and Mongoid?如何为 Rails 3.1.3 和 Mongoid 中的命名空间嵌套资源创建 form_for?
【发布时间】: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

提前致谢。

【问题讨论】:

    标签: ruby-on-rails-3 mongoid


    【解决方案1】:

    您收到undefined method 'movie' for nil:NilClass 是因为您在控制器中引用@reldate.movi​​e 并分配@api1_reldate。选择一个。

    另外,我不确定 mongoid 的需求是否不同,但 AR 使用数组作为命名空间路由和 form_for:

    发件人: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.movi​​e 是否是一部新电影,但我对此表示怀疑。

    【讨论】:

    • 谢谢马特。我尝试了您建议的解决方案,但仍然无法正常工作。帖子使用 Movies 控制器进行更新。
    猜你喜欢
    • 2011-02-12
    • 2013-01-14
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多