Ruby on Rails Редактировать и удалять комментарии
Привет, я пытаюсь добавить комментарии к моей модели булавки. Я могу добавлять комментарии, но, похоже, не могу получить правильную ссылку для своих действий по редактированию и удалению.
контроллер комментариев
class CommentsController < ApplicationController
before_action :find_pin
before_action :find_comment, only: [:destroy, :edit, :update]
def index
end
def show
end
def new
@comment = Comment.new
end
def create
@comment = @pin.comments.build(comment_params)
@comment.user_id = current_user.id
@comment.save
if @comment.save
flash[:notice] = "Created comment"
redirect_to pin_url(@pin.id)
else
render 'new'
end
end
def edit
end
def update
@comment = @pin.comments.find(params[:id])
end
def destroy
@comment.destroy
flash[:notice] = "Deleted Comment"
redirect_to pin_url(@pin.id)
end
private
def find_pin
@pin = Pin.find(params[:id])
end
def find_comment
@comment = Comments.find(params[:pin_id])
end
def comment_params
params.require(:comment).permit(:content)
end
end
просмотр формы комментариев
<%= form_for ([@comment.build]) do |f| %>
<p><%= f.text_area :content %></p>
<p><%= f.submit %></p>
<% end %>
комментарии показывают вид
<%= @comment.each do |comment| %>
<p><%= comment.content %></p>
<% if current_user == comment.user %>
<%= link_to "Edit comment", edit_comment_path(@pin, comment)%>
<%= link_to "Delete comment", [comment.pin,comment], method: :delete %>
<% end %>
<% end %>
маршруты
Rails.application.routes.draw do
match '/users', to: 'users#index', via: 'get'
match '/users/:id', to: 'users#show', via: 'get'
get 'homes/show'
devise_for :users, :path_prefix => 'd'
resources :pins do
member do
resources :comments
put "like", to: "pins#upvote"
end
end
resources :users, :only =>[:show]
root "pins#index"
end
контроллер пинов
class PinsController < ApplicationController
before_action :find_pin, only: [:show, :edit, :update, :destroy, :upvote]
before_action :authenticate_user!, except: [:index, :show]
def index
@pins = Pin.all.order("created_at DESC")
end
def show
@comment= Comment.where(pin_id: @pin).order("created_at DESC")
end
def new
@pin = current_user.pins.build
end
def create
@pin = current_user.pins.build(pin_params)
if @pin.save
redirect_to @pin, notice: "Successfully created new Pin"
else
render 'new'
end
end
def edit
if @pin.user != current_user
redirect_to root_path
end
end
def update
if @pin.update(pin_params) && @pin.user == current_user
redirect_to @pin, notice: "Pin was successfully updated"
else
render 'edit'
end
end
def destroy
if @pin.user == current_user
@pin.destroy
redirect_to root_path
else
redirect_to root_path, notice: "Not Your Pin!"
end
end
def upvote
@pin.upvote_by current_user
redirect_to :back
end
private
def pin_params
params.require(:pin).permit(:title, :description, :image)
end
def find_pin
@pin = Pin.find(params[:id])
end
end
заранее спасибо, я застрял на этом некоторое время по какой-то причине идентификатор пинов и идентификатор комментариев заканчиваются тем же самым или что-то в этом роде http://localhost:3000/pins/30/comments/30
1 ответ
Бежать rake routes
чтобы проверить все маршруты, которые у вас есть в вашем приложении. Вы обнаружите, что все маршруты будут названы во множественном числе. Так edit_pins_comments_path
будет присутствовать только для вашего приложения. Но, как предполагают ваши модели, у каждой булавки будет много комментариев. Для этого вам нужно вложить свой ресурс комментариев в каждый элемент контактов. Таким образом, ваши маршруты станут как ниже.
resources :pins do
member do
resources :comments
put "like", to: "pins#upvote"
put "favorite", to: "pins#favorite"
end
end
Этот код будет генерировать edit_comment_path
, comment_path
и т.п.