简体   繁体   中英

Polymorphic comments with nested resources in Ruby on Rails

I've followed the Go Rails tutorial below to set up comments with polymorphic associations: https://gorails.com/episodes/comments-with-polymorphic-associations

However, I have a nested situation with two models (movies/parts). It is working with 'movies' but I cannot get it working with child model 'parts'.

Models

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :commentable, polymorphic: true
end


class Movie < ApplicationRecord
  has_many :parts, dependent: :destroy
  has_many :comments, as: :commentable
end

class Part < ApplicationRecord
  belongs_to :movie
  has_many :comments, as: :commentable
end

config/routes.rb

resources :movies do
  resources :comments, module: :movies
  resources :parts do
    resources :comments, module: :parts
  end
end

app/views/movies/show.html.erb

<%= render partial: "comments/comments", locals: {commentable: @movie} %>
<%= render partial: "comments/form", locals: {commentable: @movie} %>

app/views/comments/_comments.html.erb

<h1>Comments</h1>

<% commentable.comments.each do |comment| %>
  <div class="well">
  <%= comment.summary %> by <i><%= comment.user.email %></i><br><br>
  </div>
<% end %>

app/views/comments/_form.html.erb

<%= form_for [commentable, Comment.new] do |form| %>
  <% if commentable.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(commentable.errors.count, "error") %> prohibited this comment from being saved:</h2>

      <ul>
        <% commentable.errors.each do |error| %>
          <li><%= error.full_message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="form-group">
    <%= form.text_area :summary, class: "form-control", placeholder: "Add a comment" %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

Everything above with 'movies' is working well. The problem is with 'parts'.

app/views/parts/show.html.erb

<%= render partial: "comments/comments", locals: {commentable: @part} %>
<%= render partial: "comments/form", locals: {commentable: @part} %>

Error with 'parts'

NoMethodError in Parts#show undefined method `part_comments_path' for #ActionView::Base:0x0000000003d3b0

Highlighted line of error:

<%= form_for [commentable, Comment.new] do |form| %>

I think I have to pass the movie object with the part object into 'commentable' -- since it is nested -- but don't know how to do it with this set up. Any suggestions are greatly appreciated.

I believe route in the partial meant replacing any references to part_comments_path with movie_part_comments_path.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM