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 ответов


Так пробовали?


redirect_to ticket_path(@comment.ticket_id)
 

Из коментариев и ответов не совсем понял, насколько такой вариант является правильным, но вот так все работает:


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