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
在您的控制器操作中未 初始化,所以显然 @calendar
是 nil
。错误也是如此。
要使 您的 表单在 administrations/index.html.erb
中工作,您应该在 [=15] 中包含以下代码=] 你的 administrations_controller
.
的动作
def index
@user = current_user
@administrations = @user.administrations
@calendar = Calendar.new # this one.
end
在我们的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
在您的控制器操作中未 初始化,所以显然 @calendar
是 nil
。错误也是如此。
要使 您的 表单在 administrations/index.html.erb
中工作,您应该在 [=15] 中包含以下代码=] 你的 administrations_controller
.
def index
@user = current_user
@administrations = @user.administrations
@calendar = Calendar.new # this one.
end