我在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....
我发现了相关的错误,但没有一个解决方案似乎符合我的特定问题。可能导致这种情况的任何线索?
答案 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使用相同的名称,而局部局部变量对我造成了一些冲突。