【问题标题】:NoMethodError in PostsController#createPostsController#create 中的 NoMethodError
【发布时间】:2013-04-19 16:16:09
【问题描述】:

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

PostsController#create 中的 NoMethodError

{"title"=>"" 的未定义方法 `permit', "text"=>""}: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

我做错了什么?

提前感谢您的帮助!

【问题讨论】:

  • 您在控制器操作中获得的paramsActiveSupport::HashWithIndifferentAccess 类的实例,而permit 不是该类的实例方法,因此这绝对行不通。你到底想达到什么目的?
  • 有任何答案解决了您的问题吗?如果有,请将其标记为正确答案。

标签: ruby nomethoderror


【解决方案1】:

代替这一行:

@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

【讨论】:

    【解决方案2】:

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

    attr_accessible :title, :text
    

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

    更多详情here.

    【讨论】:

    • 我在 3.2.13。我会试一试,让你们都知道进展如何。感谢您的快速回复!!!
    • 这就是答案。 OP 正在尝试在 Rails 3.2 中实现 Rails 4 功能。 attr_accessible 是正确的答案,也是处理批量分配的 4.0 之前的方法。
    【解决方案3】:

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

    在rails 3.2 中关注这个

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

    【讨论】:

      【解决方案4】:

      在文件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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-22
        相关资源
        最近更新 更多