PostsController中的NoMethodError #create

时间:2013-04-19 16:16:09

标签: ruby nomethoderror

原谅我的无知,但我不仅是Ruby的全新而且是一般的编程。我正在研究rubyonrails.org边缘指南的例子。并且我收到以下错误,尽管我查看了自应用程序上次工作以来我输入的每一段代码,但我无法修复它。

  

PostsController中的NoMethodError #create

     

{“title”=>“”的未定义方法`permit',   “文本”=> “中”}:的ActiveSupport :: HashWithIndifferentAccess

这就是我的posts_controller.rb的样子:

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

  def create
    @post = Post.new(params[:post].permit(:title, :text))

    if @post.save
      redirect_to action: :show, id: @post.id
    else
      render 'new'
    end    
  end

  def show
    @post = Post.find{params[:id]}
  end  

  def index
    @posts = Post.all
  end        
end

我做错了什么?

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:8)

而不是这一行:

@post = Post.new(params[:post].permit(:title, :text))

试试这个

 @post = Post.new(params[:post])

看起来你跑过strong_parameters并且有一些教程混音。

如果您确实想使用strong_parameters,请将gem添加到您的Gemfile中,并使用以下内容创建初始化程序:

ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)

然后您的控制器可以是:

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

  def create
    @post = Post.new(post_params)

    if @post.save
      redirect_to action: :show, id: @post.id
    else
      render 'new'
    end    
  end

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

  def index
    @posts = Post.all
  end    

  private

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

答案 1 :(得分:3)

您使用的是哪个版本的Rails? #permit是要在Rails 4.0中添加的新功能,以防止批量分配。因此,如果您使用的是3.2,则需要添加strong_parameters gem来支持此功能。或者,您可以将.permit(:title, :text)放入PostsController#create并将以下内容添加到Post模型中:

attr_accessible :title, :text

这样做是为了防止攻击者篡改提交的表单数据并更新某些未经授权的字段(例如'is_admin'或类似的东西。

更多详情here

答案 2 :(得分:1)

您所关注的指南适用于rails4,您必须安装另一个版本的rails。

关于rails 3.2

http://guides.rubyonrails.org/v3.2.13/

答案 3 :(得分:1)

在文件posts_controller.rb中,您需要添加这两种方法:

class PostsController < ApplicationController
  def new
  end
  def create
    @post = Post.new(params[:post])
    @post.save
    redirect_to @post
  end
end

然后您将此行添加到文件app/models/post.rb

  

attr_accessible:title,:text

我希望这可以帮助你解决问题:),对我来说它有效;)