在创建属于另一个模型的模型的新实例时,在#new,“未定义的方法'posts'for nil:NilClass”中获取NoMethodError

时间:2019-04-25 12:18:53

标签: ruby-on-rails

我正在为我的应用程序添加一个新模型,基本上是一个论坛,上面将有帖子。帖子属于论坛。

在为我的帖子撰写新页面时,我有以下几点:(我正在使用HAML,这就是为什么它看起来可能有点怪异的原因)

= form_for(model: [@forum, @post], local: true) do |form|
  .form-group
    .col-sm-2.control-label
      = form.label :title
    .col-sm-12
      = form.text_field :title, class: "form-control", placeholder: "Title of post", autofocus: true
  .form-group
    .col-sm-2.control-label
      = form.label :description
    .col-sm-12
      = form.text_area :description, rows: 8, class: "form-control", placeholder: "Body of post"
  .form-group
    .col-sm-12
      = form.submit class: 'btn btn-primary btn-lg'

我有form_for(model:@post),那也不起作用。 当它尝试创建帖子时,我们会收到此错误

NoMethodError in Posts#new
undefined method `model_name' for #<Hash:0x00007f801c9d39d0>

并突出显示此行

= form_for(model: [@forum, @post], local: true) do |form|

我不知道为什么会这样,并且没有类似的修复程序对我有用。这是我的posts_controller.rb:

class PostsController < ApplicationController
  before_action :set_post, only: [:edit, :show, :update, :destroy]
  before_action :require_user, except: [:index, :show]

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

def new
  @post = Post.new
end

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

def create
  @forum = Forum.find(params[:forum_id])
  @post = @forum.posts.create(post_params)
  @post.user = current_user
  if @post.save then
     redirect_to @post
  else
    render 'new'
  end
end

def update
end

def destroy
  @post = Post.find(params[:id])
  @post.destroy
  redirect_to(forums_path)
end

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

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

end

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您正在混淆form_forform_with

form_with在Rails 5中引入,以替换具有不同签名的form_forform_tag

form_for的签名为form_for(record, options = {}, &block)。这意味着这些是等效的:

form_for([@forum, @post])
form_with(model: [@forum, @post], local: true)

这也解释了错误消息:

NoMethodError in Posts#new
undefined method `model_name' for #<Hash:0x00007f801c9d39d0>

当您将哈希作为第一个参数传递给form_for时。