【问题标题】:First argument in form cannot contain nil or be empty - Rails 4表单中的第一个参数不能包含 nil 或为空 - Rails 4
【发布时间】:2013-09-17 15:20:04
【问题描述】:

我在 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....

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

【问题讨论】:

  • 你能验证@contact 不是nil 吗?我猜你的表单是从contacts#new以外的动作other渲染出来的。
  • FWIW,您所感受到的挫败感与所有学习过编码的人一样——这只是学习外国框架的自然部分。我不认为这对你的问题有任何抱怨。
  • 你能发布堆栈跟踪吗?

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


【解决方案1】:

错误信息告诉你不能拥有以下内容:

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

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

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

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

虽然不推荐

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

【讨论】:

  • 感谢@Pierre 和其他所有人。这是一个非常简单的问题,我忽略了并且过于复杂。我没有路由到正确的路径,并且目录有点混乱。
  • 这确实有效!但很好奇,为什么不推荐,事实上更好的解决方案是什么?我在我的控制器中设置了 Contact#new 操作,但如果没有此处的修复,我仍然会收到此错误。
  • @Jackson_Sandland Rails 中的 MVC 逻辑是控制器将实例变量传递给视图。 form_for 方法需要一个模型实例,以便在提交表单后正确构建 params 哈希。查看docs。您可以在视图中使用Contact.new,但这会破坏 MVC 模式,因此您不妨完全跳过控制器并在视图中包含更多逻辑。
【解决方案2】:

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

例如,我有一个 PhoneBook 模型,在我的 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>

【讨论】:

  • 有没有一种方法可以重新路由新的、创建、构建...等。对适当的控制器(联系人)采取行动,而不是在电话簿控制器中处理它?
  • PhoneBook 控制器中唯一与 Contact 相关的是初始化一个新的 Contact 对象。这是一种防止“零或空”错误发生的方法。 PhoneBook 控制器中的所有其他内容都与 PhoneBook 操作(新建、创建等)相关。您可以使用&lt;%= form_for @contact url: {controller: 'contact', action: 'create'} do |f| %&gt; 在表单顶部指定要使用的控制器和操作
【解决方案3】:

我知道这有一个公认的答案,但这并没有解决我同样的问题(我不想使用 new 在我看来),我打算发布解决我的问题。

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

在我的情况下,我使用的是 sublime 编辑器,并且我在控制器中的 def new 之上有一个额外的 def,我不知道它是如何到达那里的,但它就在那里...删除它解决了我的问题咬指甲半小时......可能有任何类型的错字导致这个问题。这个错误只是意味着新方法没有被访问,如果它被访问,它将初始化变量。

我再说一遍,总是有错别字。

希望这对任何人都有帮助。

【讨论】:

  • 就我而言,我在 model.save 上发现了一个错误,然后对新视图进行了“渲染”。因此,使用渲染只是调用视图而不是“新”操作。
  • 我遇到了同样的问题,即在控制器中定义了两次操作
  • 这对我来说是正确的答案,我在控制器的新方法中的变量名称中有错字。
【解决方案4】:

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

在你的情况下,代码应该是,

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

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

【讨论】:

    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案6】:

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

      例如..

      class PagesController < ApplicationController
      
      def home
          @applicant = Applicant.new
      end
      
      def about
      end
      
      def homeowner
      end
      

      结束

      我之前定义了一个“新”和“创建”方法,并在其中执行了通常的操作,我在其他情况下也会这样做。还是不知道为什么。

      【讨论】:

        【解决方案7】:

        我遇到了同样的问题。我有一个 Comment 模型、一个 CommentsController、一个“显示”操作和一个“显示”视图用于评论。我在“显示”视图中也有一个“_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| %>
        

        似乎对模型使用相同的名称并且部分本地对我造成了一些冲突。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-13
          • 1970-01-01
          相关资源
          最近更新 更多