Возникают проблемы с отправкой вложенного ресурса через форму [Rails 5] - PullRequest
0 голосов
/ 25 мая 2019

У меня есть Document, что has_many Section, и каждый section has_one Comment.Я хочу иметь возможность создавать как sections, так и comments в представлении Document show, но у меня возникают проблемы с получением comments.

Вот соответствующий код ссамое близкое, что у меня есть:

class CommentsController < ApplicationController
  def create
    @section = Section.find(params[:id])
    @section.comment.create(comment_params)
  end

  private

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

Маршрутизация:

resources :documents, shallow: true do
  resources :sections do
    resources :comments
  end
end 

И вид с формой:

# app/views/documents/show.html.erb

<% @document.sections.each do |section| %>
  <%= section.body %>

  <% if section.comment %>
    <p>
      <%= section.comment %>
    </p>
  <% else %>
    <%= form_with url: section_comments_path(section.id), scope: 'comment' do |form| %>
      <%= form.text_field :body, placeholder: "Comment" %>
      <%= form.submit %>
    <% end %>
  <% end %>
<% end %>

Кажется, все проверенодля меня, но когда я пытаюсь оставить комментарий, вот что я получаю:

Started POST "/sections/51/comments" for ::1 at 2019-05-24 23:29:06 +0000
Processing by CommentsController#create as JS
  Parameters: {"utf8"=>"✓", "authenticity_token"=>[...], "comment"=>{"body"=>"asdas"}, "commit"=>"Save comment", "section_id"=>"51"}
  Section Load (0.5ms)  SELECT  "sections".* FROM "sections" WHERE "sections"."id" = ? LIMIT ?  [["id", 51], ["LIMIT", 1]]
  comment Load (0.4ms)  SELECT  "comments".* FROM "comments" WHERE "comments"."section_id" = ? LIMIT ?  [["section_id", 51], ["LIMIT", 1]]
Completed 500 Internal Server Error in 11ms (ActiveRecord: 0.9ms)

NoMethodError (undefined method `create' for nil:NilClass):

app/controllers/comments_controller.rb:4:in `create'

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 25 мая 2019
Отношение

A has_one возвращает сам объект. Следовательно, @section.comment.create(comment_params) не будет работать, поскольку @section.comment равно нулю. Вместо этого попробуйте что-то вроде ...

def create
  @section = Section.find(params[:section_id])
  @comment = Comment.create(comment_params)
  @section.comment = @comment

  ...
end

Или, как указано в Руководстве по рельсам ...

При инициализации новой ассоциации has_one или own_to вы должны использовать префикс build_ для построения ассоциации, а не метод association.build, который будет использоваться для has_many или has_and_belongs_to_many ассоциации. Чтобы создать его, используйте create_ Приставка.

Что бы выглядеть так

def create
  @section = Section.find(params[:section_id])
  @section.create_comment(comment_params)

  ...
end
0 голосов
/ 25 мая 2019

Вероятно, вам нужно изменить:

@section.comment.create(comment_params)

на:

@section.comments.create(comment_params)

Если это не сработает, попробуйте:

@section.comment.create!(comment_params)

и посмотрите, чтоисключение говорит

...