Rails 4: 表单中的第一个参数不能包含 nil 或为空

Rails 4: First argument in form cannot contain nil or be empty

在我们的Rails4 app中,有四种模式:

class User < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :calendars, through: :administrations
end

class Administration < ActiveRecord::Base
  belongs_to :user
  belongs_to :calendar
end

class Calendar < ActiveRecord::Base
  has_many :administrations, dependent: :destroy
  has_many :users, through: :administrations
end

class Post < ActiveRecord::Base
    belongs_to :calendar
end

我们已经用Routing Concerns路由了对应的资源,如下:

concern :administratable do
  resources :administrations
end

resources :users, concerns: :administratable
resources :calendars, concerns: :administratable

要创建一个新的 @calendar,我们使用以下形式:

<h2>Create a new calendar</h2>
<%= form_for(@calendar) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>
  <div class="field">
    <%= f.text_field :name, placeholder: "Your new calendar name" %>
  </div>
  <%= f.submit "Create", class: "btn btn-primary" %>
<% end %>

当我们将此表单嵌入到用户的 show.html.erb 中(以便用户可以从他的个人资料创建新日历)时,一切正常。

但是,我们希望有一个特殊的页面,称为仪表板,用户可以在其中查看他所有的日历并创建一个新的。

我们认为合乎逻辑的 url 应该是 /users/:id/administrations.

因此,我们将上述表格嵌入了管理部门的index.html.erb。

一旦我们这样做并访问 /users/1/administrations,我们就会收到以下错误:

ArgumentError in AdministrationsController#index

First argument in form cannot contain nil or be empty

Extracted source (around line #432):

else
  object      = record.is_a?(Array) ? record.last : record
  raise ArgumentError, "First argument in form cannot contain nil or be empty" unless object
  object_name = options[:as] || model_name_from_record_or_class(object).param_key
  apply_form_for_options!(record, object, options)
end

编辑:这也是我们的 Administrations#Controller:

class AdministrationsController < ApplicationController

  def to_s
    role
  end

  def index
    @user = current_user
    @administrations = @user.administrations
  end

  def show
    @administration = Administration.find(params[:id])
  end

end

知道我们做错了什么吗?

First argument in form cannot contain nil or be empty

原因是 @calendar 在您的控制器操作中未 初始化,所以显然 @calendarnil。错误也是如此。

要使 您的 表单在 administrations/index.html.erb 中工作,您应该在 [=15] 中包含以下代码=] 你的 administrations_controller.

的动作
def index
  @user = current_user
  @administrations = @user.administrations
  @calendar = Calendar.new # this one.
end