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

nil*_*nil 40 ruby-on-rails ruby-on-rails-4

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

First argument in form cannot contain nil or be empty
Run Code Online (Sandbox Code Playgroud)

视图:

     <%= form_for @contact do |f| %>
     and so on.......
Run Code Online (Sandbox Code Playgroud)

调节器

def new
    @contact = Contact.new
end
 and so on....
Run Code Online (Sandbox Code Playgroud)

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

Pie*_*ois 74

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

<%= form_for nil do |f| %>
<%= form_for [] do |f| %>
Run Code Online (Sandbox Code Playgroud)

我的猜测是你@contact的设定,nil并不是你的Contact#new行动.

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

<%= form_for Contact.new do |f| %>
Run Code Online (Sandbox Code Playgroud)

虽然不推荐.

您需要检查包含表单的视图是否实际由new您的操作呈现ContactsController.

  • @Jackson_Sandland Rails中的MVC逻辑是控制器将实例变量传递给视图.`form_for`方法需要一个模型实例,以便在提交表单后正确构建params哈希.查看[docs](http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html).您可以在视图中使用`Contact.new`,但这会破坏MVC模式,因此您可以完全跳过控制器并在视图中包含更多逻辑. (3认同)

qui*_*bit 6

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

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

class PhoneBook < ApplicationController

  def index
    @contact = Contact.new
    ...
  end
end
Run Code Online (Sandbox Code Playgroud)

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

<div id="phoneBook">
  <div id="myModal" class="modal">
    <%= form_for @contact do |f| %>
    ...
  </div>
</div>
Run Code Online (Sandbox Code Playgroud)


Zia*_*hal 5

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

这总是一个错字,您可以检查您的路线$rake routes是否路线是否正常,而不是其他地方的某种类型.

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

我再说一遍,总是在某处错字.

希望这有助于任何人.

  • 就我而言,我在model.save上捕获了一个错误,然后对新视图进行"渲染".因此,使用render只调用视图而不是"新"操作. (2认同)