9

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

表单中的第一个参数不能包含 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
4

5 回答 5

17

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

def new
  @post = Post.new
end

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

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

于 2013-03-13T07:46:31.523 回答
1

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

<%= form_for Post.new do |f| %>
于 2016-02-19T20:13:25.163 回答
1

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

我假设@user我的所有视图文件都可以使用实例变量,包括可以说@clients子目录和clients/_form用于创建新客户端的那些。我的假设是不正确的,因为当它在Controller 中创建时@user会被评估。Nilclients/_form@user

于 2017-10-25T16:17:03.347 回答
0

@post的是nil

你应该form_for Post改为新职位。

于 2013-03-13T07:41:45.317 回答
0

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

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

    def new
      @post = Post.new
     end
    

然后您尝试在视图中访问

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

在上述情况下,您会收到相同的错误。

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

于 2015-01-17T07:02:47.910 回答