2015-12-01 38 views
0

我的應用程序中有批評和電影,我添加了crtics的功能以將電影添加到他們的收藏夾。既不添加也不刪除正在工作。嘗試添加時,它試圖發出修補程序請求而不是帖子。試圖刪除時,它不能使用刪除方法,因爲我不認爲它找到要刪除的對象。不知道爲什麼會這樣。我將在下面添加所有代碼和一些服務器日誌。真的需要一些幫助來解決這個問題。添加和刪除收藏夾不起作用

查看:

<%= form_for(current_critic.favorites.create, remote: true) do |f| %> 
<%= hidden_field_tag :movie_id, @movie.id %> 
<%= f.submit "Favorite" %> 
<% end %> 

其他

<%= form_for(current_critic.favorites.find_by(movie_id: @movie.id), html: { method: :delete }, remote: true) do |f| %> 
<%= f.submit "Un-Favorite" %> 
<% end %> 

控制器

class FavoritesController < ApplicationController 

def create 
    movie = Movie.find(params[:movie_id]) 
    current_critic.favorite(movie) 
    redirect_to current_critic 
end 

def destroy 
    movie = Movie.find(params[:id]) 
    current_critic.un_favorite(movie) 
    redirect_to current_critic 
end 

end 

從評論家模型

has_many :favorites, dependent: :destroy 
    has_many :movies, through: :favorites 

def favorite(movie) 
    favorites.create(movie_id: movie.id) 
end 

def un_favorite(movie) 
    favorites.find_by(movie_id: movie.id).destroy 
end 
適用代碼從電影模式

has_many :favorites, dependent: :destroy 
has_many :critics, through: :favorites 

最喜愛的模型

適用代碼

class Favorite < ActiveRecord::Base 
belongs_to :critic 
belongs_to :movie 
end 

適用航線試圖添加到收藏夾時

resources :favorites, only: [:create, :destroy] 

服務器日誌

Started PATCH "/favorites/28" for 99.39.164.184 at 2015-12-01 02:42:17 +0000 

ActionController::RoutingError (No route matches [PATCH] "/favorites/28"): 

服務器日誌嘗試取消收藏時

Started DELETE "/favorites/27" for 99.39.164.184 at 2015-12-01 03:18:24 +0000 
Processing by FavoritesController#destroy as JS 
    Parameters: {"utf8"=>"✓", "commit"=>"Un-Favorite", "id"=>"27"} 
    Movie Load (0.1ms) SELECT "movies".* FROM "movies" WHERE "movies"."id" = ? LIMIT 1 [["id", 27]] 
Completed 404 Not Found in 2ms (ActiveRecord: 0.1ms) 

ActiveRecord::RecordNotFound (Couldn't find Movie with 'id'=27): 
    app/controllers/favorites_controller.rb:10:in `destroy' 

在此先感謝。如果有其他代碼會有幫助,請告訴我。

更新:我剛剛在控制檯中測試了喜好和un_favorite方法,他們都工作;然而,有些奇怪的事情發生在id似乎不是遞增1,而是看似隨機數的情況下發生。

回答

0
  1. 第一RoutingError發生,因爲你在你看來,它返回的記錄已經有一個ID使用current_critic.favorites.create,所以form_for將它解析爲update,而不是create

=>解決方案:替換current_critic.favorites.new

  • 因爲傳遞的Favorite一個id但用來查找發生第二RecordNotFound一個Movie
  • = >解決方案:

    def destroy 
        favorite = current_critic.favorites.find(params[:id]) 
        favorite.destroy 
        redirect_to current_critic 
    end 
    
    +0

    這工作謝謝!如果你不介意,你能否澄清爲什麼這些工作?我很困惑,爲什麼創建返回一個已經存在的記錄,你能解釋它爲什麼這樣做,爲什麼新的不?對於第二種解決方案,現在它似乎破壞了控制器中的最愛,那麼模型中的un_favorite方法是不必要的? –

    +0

    @CaedBudris:當記錄持續到數據庫時,將生成'id'。如果您查看api文檔中的active_record http://apidock.com/rails/ActiveRecord/Base/create/class和http://apidock.com/rails/v3.2.13/ActiveRecord/Base/new/class:' new'只能實例化記錄,而'create'會保留它。 –

    +0

    第二個,'current_critic.favorites.find_by(movie_id:@ movie.id)'是'Favorite'對象,所以form_for將返回Favorite對象的id。你不能用'Favorite'的id來查詢'Movie'記錄,對吧? –