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

时间:2013-09-17 15:20:05

标签: ruby-on-rails ruby-on-rails-4

我在rails中的联系表单中收到此错误:

First argument in form cannot contain nil or be empty

查看:

     <%= form_for @contact do |f| %>
     and so on.......

控制器

def new
    @contact = Contact.new
end
 and so on....

我发现了相关的错误,但没有一个解决方案似乎符合我的特定问题。可能导致这种情况的任何线索?

7 个答案:

答案 0 :(得分:70)

错误消息告诉您不能拥有以下内容:

<%= form_for nil do |f| %>
<%= form_for [] do |f| %>

我的猜测是,您的@contact设置为nil,并且它不是来自您的Contact#new操作。

仅供参考,如果您这样做,它将会起作用:

<%= form_for Contact.new do |f| %>

虽然不推荐

您需要检查包含表单的视图是否实际由new的{​​{1}}操作呈现。

答案 1 :(得分:6)

我知道这有一个公认的答案,但那并没有解决我同样的问题(我不想在我的观点中使用新的),我打算发布解决了我的问题。

这总是一个错字,如果路线没问题,您可以使用$rake routes检查您的路线,而不是其他地方的某种类型。

在我的情况下,我使用了崇高的编辑器,并且我在控制器中的def new之上有一个额外的def,我不知道它是如何到达那里的,但它就在那里......删除它解决了我的问题大约半小时的指甲咬伤后......可能有任何一种错字导致这个问题。此错误仅表示未访问新方法,如果正在访问它,则会初始化变量。

我重复一遍,总是在某处错字。

希望这有助于任何人。

答案 2 :(得分:5)

我有一个类似的问题,我在一个模态中有一个表单,它改变了一个与背景页面显示的模型不同的模型。即使我在我的Contact控制器中有所需的@contact = Contact.new,我还需要在控制器中为后台页面添加此代码。

例如,我有一个PhoneBook模型,在我的PhoneBook索引视图中,我有一个模式,其中有一个表单,可以将联系人添加到我的Contact模型中。我需要在我的PhoneBook控制器的索引方法中使用@contact = Contact.new:

class PhoneBook < ApplicationController

  def index
    @contact = Contact.new
    ...
  end
end

然后我在我的模态中显示在PhoneBook index.html上的表单与其他人编写的语法相同:

<div id="phoneBook">
  <div id="myModal" class="modal">
    <%= form_for @contact do |f| %>
    ...
  </div>
</div>

答案 3 :(得分:2)

如果实际上你的实例变量应该是nil,你可以使用 :contact代替@contact并提供路径。

在您的情况下,代码应为,

<%= form_for( :contact , :html => {:class => "form-horizontal", :role => "form"}, url: login_path) do |form| %>

login_path只是一个例子,可以根据需要进行替换。

答案 4 :(得分:0)

它可以取决于定义新动作或创建动作的位置。我遇到了同样的问题,结果我不得不在页面方法中放入@Object = object.new命令。

例如......

class PagesController < ApplicationController

def home
    @applicant = Applicant.new
end

def about
end

def homeowner
end

我之前定义了一个&#34; new&#34;和&#34;创造&#34;方法,并在其他人的行动,这是通常的,我在其他情况下。仍然不知道为什么。

答案 5 :(得分:0)

我遇到了同样的问题,但是很容易修复。在您的#example posts_controler.rb中添加同一行以查找帖子,就像在编辑中一样。在我的应用程序中是

def edit
    @post = Post.find(params[:id])
end

在这里它不起作用,因为我添加了它但没有保存我的更改;)。

答案 6 :(得分:0)

我有同样的问题。我有一个Comment模型,一个CommentController,一个“显示”操作和一个用于评论的“显示”视图。我还使用以下本地方法在“显示”视图中渲染了一个“ _show”部分:

:locals => {:comment => @comment}

在“ _show”部分中,我有一个

<%= form_for(comment, :remote => true) do |f| %>

通过“形式上的第一个参数不能包含nil或为空”。我只能通过重命名本地来解决问题:

:locals => {:new_comment => @comment}

并在部分内:

<%= form_for(new_comment, :remote => true) do |f| %>

对于Model使用相同的名称,而局部局部变量对我造成了一些冲突。