Не удалось найти комментарий с 'id' = 3 с вложенными ресурсами - PullRequest
0 голосов
/ 11 октября 2019

я получаю эту ошибку: https://imgur.com/a/Mrvkm2Z Я могу создавать комментарии в своей записи курса, но не могу редактировать их из-за этой ошибки

Я не знаю, как решить эту проблему, яискал везде, но ничего, что помогло бы мне решить проблему

РЕДАКТИРОВАТЬ вот мой код в контроллере комментариев

class CommentsController < ApplicationController
  before_action :set_comment, only: [:show, :edit, :update, :destroy]

  # GET /comments
  # GET /comments.json
  def index
    @comments = Comment.all
  end

  # GET /comments/1
  # GET /comments/1.json
  def show
  end

  # GET /comments/new
  def new
    @course = Course.find(params[:course_id])
    @comment = @course.comments.build
  end

  # GET /comments/1/edit
  def edit
  end

  # POST /comments
  # POST /comments.json
  def create
    @course = Course.find(params[:course_id])
    @comment = @course.comments.build(comment_params)
    respond_to do |format|
      if @comment.save
        format.html { redirect_to @course, notice: 'Comment was successfully created.' }
        format.json { render :show, status: :created, location: @comment }
      else
        format.html { render :new }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  # PATCH/PUT /comments/1
  # PATCH/PUT /comments/1.json
  def update
    respond_to do |format|
      if @comment.update(comment_params)
        format.html { redirect_to @comment, notice: 'Comment was successfully updated.' }
        format.json { render :show, status: :ok, location: @comment }
      else
        format.html { render :edit }
        format.json { render json: @comment.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /comments/1
  # DELETE /comments/1.json
  def destroy
    @comment.destroy
    respond_to do |format|
      format.html { redirect_to comments_url, notice: 'Comment was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_comment
      @comment = Comment.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def comment_params
      params.require(:comment).permit(:title, :body)
    end
end

, поэтому я думаю, что проблема может быть в создании иНовый, я не знаю, как связать модели с одним ко многим, я смог создать комментарии в моем курсе, но когда я хотел редактировать 1 из комментариев, эта ошибка и в каждом комментарии, который я нажимаю, чтобы изменить, отправляет меня ктот же URL с тем же идентификатором ошибки = 3 не найден

Также это мой HTML-код (может быть, ошибки могут быть и там):

<%= form_for @comment, :url => course_comments_path(params[:course_id]) do |f| %>
  <% if comment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

      <ul>
      <% comment.errors.full_messages.each do |message| %>
        <li><%= message %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :title %>
    <%= f.text_field :title, id: :comment_title %>
  </div>

  <div class="field">
    <%= f.label :body %>
    <%= f.text_area :body, id: :comment_body %>
  </div>

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

и show.html для моегокурсы:

<% if current_user%>
<p id="notice"><%= notice %></p>

<p>
  <h1><%= @course.name %></h1>
</p>

<p>
    <h2>Comentarios del curso:</h2> 
</p>
<p>     
    <% @course.comments.each do |comment| %>

            <h3><%= comment.title %></h3>         
            <p><%= comment.body %></p>
            <%if current_user.admin%>
                <%= link_to 'Edit', edit_course_comment_path(@course) %>
            <%end%>
    <%end%>
</p>


<%if current_user.admin %>

    <%= link_to 'Postear', new_course_comment_path(@course)%>
    <%= link_to 'Edit', edit_course_comment_path%>
    <%= link_to 'Back',  authenticated_root_path %>


<%else%>
    <%= link_to 'Postear', new_course_comment_path(@course) %>
    <%= link_to 'Back',  authenticated_root_path %>
<%end%>

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Во-первых, у вас есть странная смесь неглубокого вложения и глубокого вложения. Неглубокое вложение - это вариант маршрутизации, который влияет на вложение маршрутов участников.

resources :courses do
  # GET|PUT|PATCH|DELETE /courses/:course_id/comments/:id
  # GET /courses/:course_id/comments/:id/edit
  resources :comments
  # GET|PUT|PATCH|DELETE /comments/:id
  # GET /comments/:id/edit
  resources :comments, shallow: true
end

Я бы обычно рекомендовал поверхностное вложение - если только дочерний объект не может существовать только в области действия своего родителя или является уникальным только в области действия. его родитель. И ваш контроллер настроен на мелкое вложение. Просто убедитесь, что вы отредактировали эти комментарии со скаффолда так, чтобы они действительно документировали правильные пути.

Помимо маршрутов, вам также необходимо использовать правильные помощники ссылок:

# deep nesting
link_to 'Edit', edit_course_comment_path(@course, @comment)

# shallow nesting
link_to 'Edit', edit_comment_path(@comment)

Если вы действительнодля поддержки обоих вы можете использовать полиморфные помощники маршрутов:

link_to 'Edit', [:edit, @course, @comment]

Для создания форм для вложенных ресурсов передайте массив, содержащий родительский и дочерний элементы:

form_for([@course, @comment])
# or in rails 5+
form_with(model: [@course, @comment])

Это прекрасно работает скак глубокое, так и неглубокое вложение, а Rails уплотняет массив. Это также позволяет вам использовать ту же часть формы для создания и обновления.

Явная передача URL для формы в Rails избыточна в 99% случаев. Если вы просто следуете соглашениям, Rails достаточно умен, чтобы найти правильный путь для создания и обновления.

0 голосов
/ 11 октября 2019

Я думаю, что эта строка

  <%= link_to 'Edit', edit_course_comment_path(@course) %>

должна быть

  <%= link_to 'Edit', edit_course_comment_path(@course, comment) %>

Вам нужны и идентификаторы курса, и комментарий.

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