未定义的方法`permit' for nil:Rails指南第5.12节中的NilClass

时间:2014-03-20 02:42:25

标签: ruby-on-rails

我被困在第5.12节,我无法弄清楚params [:post]是如何为零的。  错误消息指定在此代码的第三行中发生错误:

      def edit
        @post = Post.find(params[:id])
        if @post.update(params[:post].permit(:title, :text))
          redirect_to @post
        else
          render 'edit'
        end
      end

我的posts_controller文件如下所示:

    class PostsController < ApplicationController
      def new
        @post = Post.new
      end

      def index
        @posts = Post.all
      end

      def create
        @post = Post.new(params.require(:post).permit(:title, :text))
        if @post.save
        redirect_to @post
        else
          render 'new'
        end
      end

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

      def edit
        @post = Post.find(params[:id])
        if @post.update(params[:post].permit(:title, :text))
          redirect_to @post
        else
          render 'edit'
        end
      end
    end

2 个答案:

答案 0 :(得分:1)

首先,edit操作用于呈现edit帖子页面。所以,你不会得到params [:post]。它总是零。因此,错误。

所以你的edit行动应该是:

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

在此之后,您需要在控制器中添加以下update操作,该操作将在edit帖子页面上提交表单时调用。

 def update
    @post = Post.find(params[:id])
    if @post.update(params.require(:post).permit(:title, :text))
      redirect_to @post
    else
      render 'edit'
    end
  end

这将解决当前的问题。

注意:

我强烈建议将params.require(:post).permit(:title, :text)的重复逻辑移到@ user3317140建议的私有方法中。

答案 1 :(得分:0)

修改add a check for :post

if params.has_key?(:post)
  @post.update(params[:post].permit(:title, :text))
  redirect_to @post
else
  render 'edit'
end

在PostsController类的末尾添加它&lt; ApplicationController中

private
def post_params
  params.require(:post).permit(:title, :text)
end