Ruby & Ruby on Rails « Не redirect to куда надо.
Есть модель Ticket и модель Comment. Стандартный проект - тикеты имеют много коментариев и каждый коментарий принадлежит одному тикету. Проблема возникает при удалении коментариев;
Значит так:
#app/view/comments/_comment.html.erb
Comments:
<% @ticket.comments.each do |comment| %>
<%= comment.commenter %>
<%= comment.body %>
<%= link_to "Delete comment",
comment, :method => :delete %>
<% end %>
и контроллер:
#app/controllers/comments_controller.rb
class CommentsController < ApplicationController
def create
@ticket = Ticket.find(params[:ticket_id])
@comment = @ticket.comments.create(params[:comment])
flash[:notice] = "Comment was created."
redirect_to ticket_path(@ticket)
end
def destroy
@comment = Comment.find(params[:id])
@comment.destroy
flash[:alert] = "Comment was deleted."
redirect_to root_path
end
end
и
# config/routes.rb
root :to => 'tickets#index'
resources :tickets do
resources :comments
end
resources :comments
Вот так все работает как и ожидается. Но мне необходимо что-бы redirect_to был не на root_path, а на тот тикет, с которго удален коментарий. То-есть, после удаления коментария, пользователь попадает на... фактически, возвращается на ту же страницу. Как-то так. Пытался добавить в destroy метод
@ticket = Ticket.find(params[:ticket_id])
и далее редирект на @ticket, или на ticket_path (и кучу других вариантов), но не работает. Пишет что-то, неможет найти тикет с таким-то id.
В общем, испробовал тучу разных примеров, вариантов и т.д. Создается впечатление, что я просто чего-то непонимаю.
Заранее спасибо, если кто сможет помочь.
P.S. Надеюсь понятно задал вопрос. Если что, не судите строго, пожалуйста.
1 ответов
Из коментариев и ответов не совсем понял, насколько такой вариант является правильным, но вот так все работает:
def destroy
@comment = Comment.find(params[:id])
@comment.destroy
flash[:alert] = "Comment was deleted."
redirect_to ticket_path(@comment.ticket_id)
end
Большое спасибо всем.
Продолжаю идти вперед.
Для начала, код в _comments должен быть таким:
<%= comment.commenter %>
<%= comment.body %>
<%= link_to "Удалить комментарий", comment, :method => :delete %>
И вызов его таким:
<%= render :partial => 'comments/comment', :collection => @ticket.comments %>
Далее, вы еще забыли запостить сюда код моделей, хотя из описания ясно, что:
class Ticket < ActiveRecord::Base
has_many :comments, :dependent => :destroy
end
class Comment < ActiveRecord::Base
belongs_to :ticket
end
И вот как раз ассоциации нам и нужны в контролле в методе destroy:
class CommentsController < ApplicationController
#тут остальной код
def destroy
@comment = Comment.find(params[:id])
@ticket = @comment.ticket
@comment.destroy
flash[:notice] = "Комментарий был успешно удален."
redirect_to @ticket
end
end
UPDATE (учтем замечания в комментах):
Во вью:
<%= link_to "Удалить комментарий", ticket_comments_url(ticket), :method => :delete %>
<%= render :partial => 'comments/comment', :collection => @ticket.comments, :locals => {:ticket => @ticket} %>
Контроллер:
class CommentsController < ApplicationController
#тут остальной код
def destroy
@comment = Comment.find(params[:id])
@ticket = Ticket.find(params[:ticket_id]) # запрос нужен, т.к. мы хотим
# убедиться, что Ticket c id == params[:ticket_id]
# дейтвительно существует
@comment.destroy
flash[:notice] = "Комментарий был успешно удален."
respond_to do |format|
format.html { redirect_to(ticket_comments_url(@ticket) }
format.xml { head :ok }
end
end
end