6

Forgive my ignorance but I am brand new not only to Ruby but programming in general. I am working through the example on edge guides at rubyonrails.org. and am receiving the following error and despite reviewing every piece of code I've typed since the app last worked I am unable to fix it.

NoMethodError in PostsController#create

undefined method `permit' for {"title"=>"", "text"=>""}:ActiveSupport::HashWithIndifferentAccess

And this is what my posts_controller.rb looks like:

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

What am I doing wrong?

Thank you in advance for any help!

4

4 回答 4

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
于 2013-04-19T16:26:08.323 回答
3

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

attr_accessible :title, :text

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

更多细节在这里

于 2013-04-19T16:27:40.497 回答
1

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

对于rails 3.2,请遵循此

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

于 2013-04-19T16:28:42.203 回答
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

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

于 2013-09-11T22:12:11.740 回答