Получение NoMethodError в #new, «неопределенный метод« posts »для nil: NilClass» при создании нового экземпляра модели, которая принадлежит другой модели - PullRequest
0 голосов
/ 25 апреля 2019

Я добавляю новую модель в свое приложение, в основном форум, который будет иметь сообщения.Посты принадлежат_ форумам.

Когда я пишу новую страницу для моих постов, я имею следующее: (Я использую 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 (модель: @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 голосов
/ 26 апреля 2019

Вы путаете form_for и form_with.

form_with с было введено в Rails 5 для замены form_for и form_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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...