原谅我的无知,但我不仅是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
我做错了什么?
提前感谢您的帮助!
答案 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)
答案 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
我希望这可以帮助你解决问题:),对我来说它有效;)