2016-10-16 3 views
0

Я на странице видео-шоу (который принадлежит сообщению). Link_to delete работает просто отлично, пока я не создаю комментарий на этой странице видеороликов. У меня есть ряд водосвинку тестов, проверки, что link_to удалить видео работает, пока я не создать комментарий по этому видео, на котором точка рельсы возвращается ...Rails, link_to метод:: delete breaks after child element (комментарий) экземпляр

Failure/Error: <%= link_to "Delete Video", post_video_path(@video), method: :delete %> 

ActionView::Template::Error: 
    No route matches 

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

post_video_path(@video) 

который вернул правильный путь, например

[1] pry(#<#<Class:0x007f891941dee0>>)> post_video_path(@video) 
=> "/posts/1/videos/1" 

Когда спецификации конкретизирует комментарий, путь выглядит следующим образом ...

[1] pry(#<#<Class:0x007f891c2fd0a8>>)> post_video_path(@video) 
ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"videos", :post_id=>#<Video id: 1, user_id: 1, post_id: 1, title: "18title", url: "https://www.youtube.com/watch?v=tYm_182oCVdSM", embed_id: "https://www.youtube.com/watch?v=tYm_182oCVdSM.spli...", tags: nil, created_at: "2016-10-16 22:12:30", updated_at: "2016-10-16 22:12:30">, :video_id=>"1"} missing required keys: [:id] 

videos_controller.rb
def show 
    @video = Video.find(params[:id]) 
    @user = @video.user 
    @post = @video.post 
    @comment = Comment.new 
    @comments = @video.comments 
end 

видео/show.html.erb

<%= @video.title %> 
<%= content_tag(:iframe, nil, src: "//www.youtube.com/embed/#{@video.embed_id}") %> 
<% binding.pry %> 
<%= link_to "Delete Video", post_video_path(@video), method: :delete %> 
<%= link_to('Back', user_post_path(@user, @post)) %> 

<h3>Comments</h3> 

<%= form_for [@video, @comment] do |f| %> 
    <%= f.label(:body, "Comment") %> 
    <%= f.text_area(:body) %> 
    <%= f.submit("Submit Comment") %> 
<% end %> 

<% @comments.each do |comment| %> 
    <%= comment.body %> 
    <%= comment.user %> 
<% end %> 

routes.rb

Rails.application.routes.draw do 
    devise_for :users 

    resources :users, only: [] do 
    collection do 
     get '/show_profile', to: 'users#show_profile', as: 'my_profile' 
     get '/show_log', to: 'users#show_log', as: 'my_log' 
    end 
    resources :posts, only: [:new, :create, :show] 
    end 

    resources :posts do 
    resources :videos 
    end 

    resources :videos do 
    resources :comments 
    end 

    root 'home#index' 
end 

модели/comment.rb

class Comment < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :video 

    validates :body, presence: true 
end 

Пожалуйста, дайте мне знать, если вы хотели бы видеть какой-либо конкретный файл или код.

Спасибо!

+1

Добро пожаловать в Stack Overflow. Пожалуйста, прочитайте «[mcve]». Мы должны иметь возможность дублировать проблему на основе кода и входных данных, которые вы нам даете. Если сотрудник подошел с напечатанной страницей, содержащей ваш вопрос, передал ее вам и ушел, не могли бы вы ответить на вопрос? Что бы вы попросили?Добавьте эту дополнительную информацию к своему вопросу, потому что мы либо попросим об этом, либо мы попытаемся угадать, что это такое, и угадайте, что это приведет к диким ответам, которые никому не помогут хорошо. –

+1

Отмечено. Полагаю, я добавил все, что уместно. Если мне что-то не хватает, сообщите мне. –

+1

Отлично. Спасибо! Очень важно вникать и попытаться найти ответ впереди, и если вы не можете затем обобщить работу, которую вы сделали в своем вопросе, и достаточно предоставить нам возможность дублировать вашу работу и двигаться вперед. Без этого мы будем дублировать то, что вы пытались, или, что еще хуже, пытаться научить тому, что вы должны знать и должны были сделать! :-) И, кстати, ваш вопрос поможет другим, которые ищут подобные решения в будущем, это не просто помочь вам сейчас. Вот почему мы спрашиваем и отвечаем. –

ответ

0

Вообще говоря, при использовании имени пути, имеющего имена двух моделей, вам необходимо передать две модели.

, например, в вашем случае, ваш путь post_video_path(@video) - что это ожидает, что для вас, чтобы передать его post и video например post_video_path(@post, @video)

если не ... то запутается, возможно, в способ, которого вы не ожидали. В этом случае я предполагаю, что он принимает идентификатор видео и полагает, что это post_id.

Вы можете сказать, что это смущает взгляд на это сообщение об ошибке:

ActionController::UrlGenerationError: No route matches {:action=>"show", :controller=>"videos", :post_id=>#<Video id: 1, user_id: 1, post_id: 1, title: "18title", 

В частности, часть, которая имеет: :post_id=>#<Video id: 1, ... -> это положить видео в post_id. Вполне возможно, что он только «работал» раньше, потому что у вас был единственный пост и одно видео ... и, следовательно, когда он использовал идентификатор 1 из видео как после id ... видео было уже присвоено пост (у которого также был идентификатор 1) ... но как только вы удалите его, он больше не существует. Это общая догадка - неважно, так ли Rails запутался, пока вы узнаете, где происходит ошибка.

+1

Это была моя проблема. Спасибо! –