【问题标题】:Form_for "First argument in form cannot contain nil or be empty" errorForm_for“表单中的第一个参数不能包含 nil 或为空”错误
【发布时间】:2017-10-26 00:59:23
【问题描述】:

我无法弄清楚为什么会出现此错误,以及它的确切含义。

表单中的第一个参数不能包含 nil 或为空(第 3 行)

添加新帖子

<%= form_for @post do |f| %>  //Error here
<p>
    <%= f.label :title, 'Title' %><br/>
    <%= f.text_field :title %><br/>
</p>
<p>
    <%= f.label :content, 'Content'%><br/>
    <%= f.text_area :content %><br/>
</p>
<p>
    <%= f.submit "Add a New Post" %>
</p>
<% end %>

控制器:

class PostsController < ApplicationController
    def index
        @posts = Post.all
    end

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

    def new
        @post = Post.new
    end

    def create
        @post = post.new(params[:post])

        if @post.save
            redirect_to posts_path,  :notice => "Your post was saved"
        else
            render "new"
        end
    end

    def edit

    end

    def update

    end

    def destroy

    end
end

【问题讨论】:

  • 你是如何声明@post的?
  • 你的@post 应该是 nil
  • 向我们展示您的控制器代码
  • 我在帖子中的新操作有错字,感谢您的帮助
  • 当然@post = post.new(params[:post]) 应该是`@post = Post.new(params[:post])

标签: ruby-on-rails ruby


【解决方案1】:

假设您从 PostsController 渲染它并使用常规视图名称,您的 new 方法应该创建一个新的 Post 并分配它:

def new
  @post = Post.new
end

您可以使用类名(如@Yuriy 建议的那样),但常规方法是实例化一个新对象。这允许您在保存后重新使用相同的表单视图来呈现错误。

如果你想看看这通常看起来如何,创建一个新的 Rails 项目并使用脚手架生成器创建一些示例代码。

【讨论】:

    【解决方案2】:

    使用这个(不推荐)。它应该工作。

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

    【讨论】:

      【解决方案3】:

      我收到了同样的错误信息。当我收到此错误消息并认为未安装 simpleform 时,我只是试图启动并运行 simpleform,并在我的视图中创建了一个子目录来测试表单。

      我假设像@user 这样的实例变量可用于我的所有视图文件,包括假设@clients 子目录和用于创建新客户端的clients/_form 中的那些。我的假设不正确,因为@userclients/_form@user 控制器中创建时将评估为Nil

      【讨论】:

        【解决方案4】:

        您的@postnil

        您应该form_for Post 代替新帖子。

        【讨论】:

        • 您能详细解释一下吗?可以举个例子吗?
        • 我支持这条评论。在哪里?在控制器中?还是形式?
        【解决方案5】:

        要了解此错误,您收到此错误的具体原因有两个。

        1. 当您尝试访问未定义或拼写错误的实例变量时。例如在你的控制器中,如果你定义像

          def new
            @post = Post.new
           end
          

        然后您尝试在视图中访问,例如

          <%= form_for @posts method: :post do |f| %> #plural name
        

        在上述情况下,您会遇到同样的错误。

        另一种情况是,如果您未定义实例或未在控制器中分配实例变量并尝试在视图中访问它,您将得到相同的错误。

        【讨论】:

          猜你喜欢
          • 2016-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多