如何在未实际从网站中删除项目的情况下删除rails中的项目(例如从愿望清单中删除产品)

时间:2015-11-08 15:05:27

标签: ruby-on-rails ruby

我正在尝试添加一个删除按钮,允许用户删除他们创建的列表中的电影,但实际上无法从网站中删除该电影。

这就是我在列表显示页面中的内容

<%= link_to 'Destroy', @list, method: :destroy, data: { confirm: 'Are you sure?' } %>

显然@list会破坏整个列表,我不希望这样。我希望他们可以选择删除整个列表,但我也希望他们可以选择删除列表中的项目。

在我的列表控制器中我只有

def destroy
 @list.destroy
 respond_to do |format|
format.html { redirect_to lists_url, notice: 'List was successfully destroyed.' }
format.json { head :no_content }
 end
end

在我的电影控制器中我有同样的事情,除了

@movie.destroy

我试过

<%= link_to 'Destroy', @list[:movie_id], method: :destroy, data: { confirm: 'Are you sure?' } %>

但是由于我正在调用实际的电影ID,所以只给了我一个路由错误,我只想要列表项的id。

在我的routes.db中我有这个

Rails.application.routes.draw do
 devise_for :users
 resources :lists 
 resources :users, only: [:show, :edit, :update]
 resources :movies, except: [:index] do
  member do
  put "like", to: "movies#upvote"
  put "dislike", to: "movies#downvote"
 end
end
 get "discover", to: "movies#index"
 get "movies", to: "movies#films"
get "tv_shows", to: "movies#tv_shows"
resources :users, only: [:index, :show]
resources :comments, only: [:create, :destroy]

 devise_scope :user do
 authenticated :user do
  root 'movies#films', as: :authenticated_root
  end
 end

1 个答案:

答案 0 :(得分:0)

您需要第三个模型才能在电影和列表之间进行关联,因为这是一种多对多关系。以下是模型关系的外观:

class List < ActiveRecord::Base
  has_many :list_movies
  has_many :movies, through: :list_movies
end

class ListMovie < ActiveRecord::Base
  belongs_to :list
  belongs_to :movie
end

class Movie < ActiveRecord::Base
  has_many :list_movies
  has_many :lists, through: :list_movies
end

迁移以在列表和电影之间添加连接表:

class CreateAppointments < ActiveRecord::Migration
  def change     
    create_table :list_movies do |t|
      t.belongs_to :lists, index: true
      t.belongs_to :movies, index: true
      t.timestamps null: false
    end
  end
end

正确建立结构后,您将能够从用户列表中添加和删除电影,因为它们被引用为list_movies。 list_movie简单地将特定电影与特定列表相关联。在更改列表时,实际上只会添加或删除list_movie记录,而不是实际的电影记录。

如果你想删除一个真实的电影,并且你想要删除用户列表中该电影的所有实例,你可能想要为模型添加依赖的破坏,即“dependent :: destroy”和相同的列表:

class List < ActiveRecord::Base
  has_many :movies, through: :list_movies, dependent: :destroy
end 
class Movie < ActiveRecord::Base
  has_many :lists, through: :list_movies, dependent: :destroy
end

然后添加适当的路线。

最后,在您的视图中,您将能够执行以下操作:

<% @list.movies.each do |movie| %>
  <h3><%= movie.title %></h3>
  <%= link_to 'Destroy', movie, method: :delete, data: { confirm: 'Are you sure?' } %>
<% end %>

有关Rails中关联的更多信息,请访问:http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association