我正在尝试添加一个删除按钮,允许用户删除他们创建的列表中的电影,但实际上无法从网站中删除该电影。
这就是我在列表显示页面中的内容
<%= 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
答案 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