ActionController :: ParameterMissing в / posts параметр отсутствует или значение пустое: запись на рельсы 5.2 - PullRequest
0 голосов
/ 19 января 2019

У меня проблема с параметрами params. Я следую руководству по rails, чтобы реализовать комментарии в моем приложении, но когда я пытаюсь опубликовать комментарий, я получаю сообщение об ошибке:

ActionController::ParameterMissing at /posts param is missing or the value is empty: post

Это код в контроллере, который выдаст ошибку

def post_params
    params.require(:post).permit(:title, :text).tap do |post_params|
        post_params.require(:title, :text)
    end
end

вот метод create, связанный с методом post_params

def create
    @post = Post.new(post_params)
    if  @post.save
        redirect_to @post
    else
        render 'new' 
    end   
end

и это представление, где я вызываю form_with

<h1>My post</h1>

<p><%= @post.title%></p>
<p><%= @post.text%></p> 
<h2>Add a comment</h2>
<%= form_with(model: [@post, @post.comments.build], url: post_path, local: true) do |form|%>
    <p>
        <%= form.label :body%><br>
        <%= form.text_field :commenter%>
    </p>
    <p>
        <%= form.label :body%>
        <%= form.text_area :body%>
    </p>
    <p>
        <%= form.submit%>
    </p>
<% end%>
<p><%= link_to "edit", edit_post_path %></p>

Контролер комментариев:

class CommentsController < ApplicationController
    def create
        @post = Post.find(params[:post_id])
        @comment = @post.comments.create(comment_params)
        redirect_to post_path(@post)
    end

    private 

    def comment_params
        params.require(:comment).permit(:commenter, :body)
    end
end

Routes.rb

Rails.application.routes.draw do
  resources :posts
  resources :comments
  root 'home#index'
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

1 Ответ

0 голосов
/ 19 января 2019

Удалить url: post_path из вашего form_with.

form_with сможет правильно направить форму только с [@post, @post.comments.build].Это должно привести к post_comments_path, но вы переопределяете это к post_path.Когда форма отправляется, posts#create вызывается, и params.require(:post) выдает ошибку, потому что в объекте params нет ключа post.

post_comments_path будет направлен на comments#create, которыйдолжен работать как ожидалось.Вы можете добавить url: post_comments_path, чтобы быть явным.

Обновление:

NoMethodError вызвано отсутствием вложенных маршрутов.В настоящее время маршрутизация для комментариев основана на /comments/:id маршрутах и ​​генерирует comment_path помощников.

Мы можем использовать вложенных маршрутов , чтобы лучше определить наши отношения и сделать наши действия контроллера немного чище.Мы хотим обновить routes.rb следующим образом:

(у вас также должен быть ваш корневой маршрут вверху файла маршрутов)

Rails.application.routes.draw do
  root 'home#index'

  resources :posts do
    resources :comments
  end
end

С комментариямивложенный внутри блока posts Rails создаст вложенные маршруты, похожие на posts/:post_id/comments/:comment_id и post_comments_path.

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